是否有任何 RDBMS 提供预准备语句的功能?

Posted

技术标签:

【中文标题】是否有任何 RDBMS 提供预准备语句的功能?【英文标题】:Does any RDBMS provide the feature of prepared statements? 【发布时间】:2018-06-13 17:18:35 【问题描述】:

我在 Java 中学习了 JDBC 中准备好的语句的概念。所以我认为prepared statement是JDBC中的一个概念,而不是RDBMS中的一个概念。

为了看看我的猜测是否正确,请问是否有任何主要的 RDBMS 在它们的类似 PL/PSM 的语言中提供准备语句的功能,例如 PL/SQL、PL/pgSQL、mysql、Transact-SQL?

如果有任何这样的 RDBMS,是否以 SQL 或类似 PL/PSM 的语言提供准备好的语句,例如 PL/SQL、PL/pgSQL、MySQL、Transact-SQL?

我阅读了DIfference Between Stored Procedures and Prepared Statements..?,但我找不到提供prepared statements 的功能,虽然我认为prepared statement 是JDBC 中的一个概念,而不是RDBMS 中的一个概念,而存储过程只是RDBMS 中的一个概念。

【问题讨论】:

至少 Oracle 和 Postgres 有服务器端准备好的语句。 谢谢。你能指出他们的使用参考和例子吗? 对于 Postgres:postgresql.org/docs/current/static/sql-prepare.html PL/PSM, PL/PSQL, PL/pgSQL等跟prepared statements没有关系,它们是关于存储过程的(除了存储过程通常也可以准备和执行prepared statements) .对于一个以提问赢得大部分声誉的人来说,你在措辞好的和中肯的问题上非常糟糕。在任何情况下,准备好的语句都在 SQL 标准中定义(例如,参见 ISO-9075-2:2016,第 20.7 节 )。 这与你的英语使用无关。您以令人困惑的方式混淆了多个概念,提出了多个问题并且高度不具体和模糊。在我看来,这些都是危险信号。 【参考方案1】:

每个符合 SQL 的 RDBMS 实现都应支持用于服务器端预准备语句的 API。我想不出一个不支持预准备语句的 RDBMS。

JDBC 有一个 PreparedStatement 类。每个品牌的 JDBC 驱动程序的实现都不同,但我使用的所有这些都只是委托给 RDBMS API。 JDBC 驱动程序向数据库服务器发送一个 SQL 查询字符串,该 SQL 可能包含参数占位符,例如 ?(某些品牌 — 如 Oracle — 支持命名参数)。

一些数据库实现提供了可用于执行预准备语句的包或函数,因此您可以在运行时在存储过程中创建查询。

甲骨文:https://docs.oracle.com/cd/A57673_01/DOC/api/doc/PAD18/ch8.htm Microsoft SQL Server:https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-prepare-transact-sql?view=sql-server-2017

一些数据库实现还支持可以作为查询调用的PREPAREEXECUTE 语句。这允许您在存储过程或 SQL 脚本中使用准备好的语句。

MySQL:https://dev.mysql.com/doc/refman/8.0/en/sql-syntax-prepared-statements.html PostgreSQL:https://www.postgresql.org/docs/10/static/sql-prepare.html

【讨论】:

谢谢。根据您提供的链接,Oracle、SQL Server 和 MySQL 中的准备语句是从字符串创建的,因此似乎是动态 SQL。另一方面,准备好的语句不是从 PostgreSQL 和SQL 中的字符串创建的,那么它们是 PostgreSQL 和 SQL 中的动态 SQL 吗? PostgreSQL 中的预处理语句与 MySQL、SQL Server 和 Oracle 数据库中的预处理语句概念是否相同? ***.com/questions/50849126/…

以上是关于是否有任何 RDBMS 提供预准备语句的功能?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL的预编译功能

MySQL的预编译功能

Mysql的预编译和批处理

C中预编译详解

使用Linux功能是否会禁用LD_PRELOAD

WebView2 中的搜索功能