预处理

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

  • 每次执行语句时解析语句的效率提高。通常,数据库应用程序处理大量几乎相同的语句,只更改子句中的文字或变量值,例如用于查询和删除的 WHERE、用于更新的 SET 和用于插入的 VALUES

  • 防止 SQL 注入。参数值可以包含未转义的 SQL 引号和分隔符,一次编译,多次运行,省去了解析优化等过程。

PREPAREEXECUTE、和 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. );
  7. -- 插入数据
  8. INSERT INTO customers (id, name, email)
  9. VALUES (1, 'John Doe', 'john@example.com'),
  10. (2, 'Jane Smith', 'jane@example.com'),
  11. (3, 'Mike Johnson', 'mike@example.com');
  12. -- 进行预处理
  13. mysql> PREPARE stmt FROM 'SELECT * FROM customers WHERE id = ?';
  14. Query OK, 0 rows affected (0.02 sec)
  15. -- 执行预处理
  16. mysql> SET @id = 2;
  17. Query OK, 0 rows affected (0.00 sec)
  18. mysql> EXECUTE stmt USING @id;
  19. +------+------------+------------------+
  20. | id | name | email |
  21. +------+------------+------------------+
  22. | 2 | Jane Smith | jane@example.com |
  23. +------+------------+------------------+
  24. 1 row in set (0.01 sec)
  25. -- 删除预处理
  26. mysql> DEALLOCATE PREPARE stmt;
  27. Query OK, 0 rows affected (0.00 sec)

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

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

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

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