预处理

MatrixOne 提供对服务器端预处理语句的支持。利用客户端或服务器二进制协议的高效性,对参数值使用带有占位符的语句进行预处理,执行过程中的优点如下:

  • 每次执行语句时解析语句的效率提高。通常,数据库应用程序处理大量几乎相同的语句,只更改子句中的文字或变量值,例如用于查询和删除的 WHERE、用于更新的 SET 和用于插入的 VALUES。
  • 防止 SQL 注入。参数值可以包含未转义的 SQL 引号和分隔符,一次编译,多次运行,省去了解析优化等过程。

PREPARE、EXECUTE、和 DEALLOCATE PREPARE 语句

PREPARE 语句的 SQL 基本语法主要为以下三种 SQL 语句:

创建预处理语句

1. PREPARE stmt_name FROM preparable_stmt
参数 说明
stmt_name 预编译的 SQL 语句的名称
preparable_stmt 包含 SQL 语句文本的字符串文字或用户变量。文本必须代表单个语句,而不是多个语句。

执行预处理语句

1. EXECUTE stmt_name [USING @var_name [, @var_name] ...]
参数 说明
stmt_name 预编译的 SQL 语句的名称

删除预处理语句

1. {DEALLOCATE | DROP} PREPARE stmt_name
参数 说明
stmt_name 预编译的 SQL 语句的名称

示例

1. -- 创建表
2. CREATE TABLE customers (
3. id INT PRIMARY KEY,
4. name VARCHAR(50),
5. email VARCHAR(50)
6. );

8. -- 插入数据
9. INSERT INTO customers (id, name, email)
10. VALUES (1, 'John Doe', 'john@example.com'),
11. (2, 'Jane Smith', 'jane@example.com'),
12. (3, 'Mike Johnson', 'mike@example.com');

14. -- 进行预处理
15. mysql> PREPARE stmt FROM 'SELECT * FROM customers WHERE id = ?';
16. Query OK, 0 rows affected (0.02 sec)

18. -- 执行预处理
19. mysql> SET @id = 2;
20. Query OK, 0 rows affected (0.00 sec)

22. mysql> EXECUTE stmt USING @id;
23. +------+------------+------------------+
24. | id   | name       | email            |
25. +------+------------+------------------+
26. |    2 | Jane Smith | jane@example.com |
27. +------+------------+------------------+
28. 1 row in set (0.01 sec)

30. -- 删除预处理
31. mysql> DEALLOCATE PREPARE stmt;
32. Query OK, 0 rows affected (0.00 sec)

上述示例首先创建了一个名为 customers 的表,该表包含 id、name 和 email 三个列。接下来,插入了三条数据到该表中。

然后,使用 PREPARE 语句进行预处理,将 SELECT * FROM customers WHERE id = ? 作为预处理语句保存在 stmt 中。

执行预处理时,将 @id 变量设置为 2,并使用 EXECUTE 语句执行预处理,将 @id 作为参数传递给预处理语句。

最后,使用 DEALLOCATE PREPARE 语句删除预处理,释放相关资源。