3GL 提供了在执行语句之前准备语句的机制。例如
SELECT name
FROM people
WHERE age=:AGE
然后可以针对不同年龄执行相同的查询。但是这样的语句也可以在“普通”的 Oracle SQL 客户端中准备吗?在 SQL Plus 或 dbForge Studio for Oracle 中是否可以像在 Java 或 C# 或任何其他支持预准备语句的编程语言中一样执行相同的操作?
3GL 提供了在执行语句之前准备语句的机制。例如
SELECT name
FROM people
WHERE age=:AGE
然后可以针对不同年龄执行相同的查询。但是这样的语句也可以在“普通”的 Oracle SQL 客户端中准备吗?在 SQL Plus 或 dbForge Studio for Oracle 中是否可以像在 Java 或 C# 或任何其他支持预准备语句的编程语言中一样执行相同的操作?
在 dbForge Studio for Oracle 中,可以使用命名参数,前面有一个冒号:
SELECT *
FROM people
WHERE name=:name
然后可以使用 SQL 工具栏中的“编辑参数对话框”来填写参数。
我知道你问的不是 PostgreSQL,而是 Oracle。但是,值得注意的是,PostgreSQL 在其 SQL 语言中具有此功能。
SQL 标准包括一个 PREPARE 语句,但它仅用于嵌入式 SQL。PREPARE 语句的 PostgreSQL 版本的工作方式如下:
PREPARE nameByAge(number) AS
SELECT name
FROM People
WHERE age=$1;
你像这样使用它:
EXECUTE nameByAge(18);
EXECUTE nameByAge(50);
所以不幸的是,对于 Oracle SQLPlus,答案似乎是否定的,不是绑定变量。但是 SQLPlus 有替换变量,类似于 shell 脚本。您将它们用作 &1, &2, &3, ... 并且它们从调用 SQLPlus 脚本的方式中获取参数。
sqlplus user/password @script.sql 18
sqlplus user/password @script.sql 50
与 script.sql 是
SELECT name
FROM People
WHERE age=&1;
这会起作用,即使它没有绑定。但是,您真的关心重复解析时间的微小节省吗?事实上,Oracle 对 SQL 语句进行哈希处理,并且已经用绑定变量替换了常量,以便能够更好地重用查询计划。因此,使用 PREPARE 和 BIND 所节省的成本实在是微乎其微。