1

3GL 提供了在执行语句之前准备语句的机制。例如

 SELECT name
 FROM people
 WHERE age=:AGE

然后可以针对不同年龄执行相同的查询。但是这样的语句也可以在“普通”的 Oracle SQL 客户端中准备吗?在 SQL Plus 或 dbForge Studio for Oracle 中是否可以像在 Java 或 C# 或任何其他支持预准备语句的编程语言中一样执行相同的操作?

4

2 回答 2

3

在 dbForge Studio for Oracle 中,可以使用命名参数,前面有一个冒号:

SELECT *
FROM people
WHERE name=:name

然后可以使用 SQL 工具栏中的“编辑参数对话框”来填写参数。

于 2013-10-24T09:27:21.000 回答
-2

我知道你问的不是 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 所节省的成本实在是微乎其微。

于 2019-04-06T01:14:48.333 回答