如果我从 Pl-sql 命令提示符运行命令以一一插入多行而无需再次重写语句,我们可以使用&
运算符,如下图所示。
如果我为相同目的使用 GUI 方法,我必须使用:
操作符,如下图所示
现在我的问题是->为什么我们不能&
在 GUI 中使用运算符,如果我们使用它会出错。
&
运算符不是绑定方法 - 它是substitution variable
. 它具有完全不同的使用范围。像这样:
18:46:18 TEST@oars_sandbox> accept table_name char prompt "enter table name > "
enter table name > dual
18:46:42 TEST@oars_sandbox> select * from &table_name
18:46:47 2 /
D
-
X
基本上,sql*plus(您正在使用的命令行工具)将脚本主体中的这些变量替换为它们在运行时的值。它为您设计脚本提供了极大的灵活性——例如,动态更改您的 sql*plus 脚本(甚至匿名 pl/sql 块)逻辑。例如,这就是我为假脱机文件分配文件名的方式:
col filename noprint new_value spool_file
select '&spoolpath\'
|| to_char(sysdate, 'yyyymmdd_hh24mi')
||'_'|| '&_user'
||'_'|| '&_connect_identifier'
||'_'|| '&mysid'
|| '.log' as filename
from dual;
set termout on
prompt spooling to &spool_file
spool "&spool_file" replace
这两种绑定变量的方法都不是 SQL 引擎的一部分:它们都是客户端的便利。由于客户不同,它们具有不同的便利功能。
您所说的“Pl-sql 命令提示符”不是这样的:它是客户端工具SQL*Plus 的提示符,而不是像过程语言 PL/SQL 那样的数据库的一部分。
您正在使用的另一个工具类似于 APEX 中的 SQL 工作表。我想如果我猜测一下,我会说他们选择了 ':' 而不是 '&',因为它是多年后开发的,当时似乎是更自然的选择。Oracle Express Edition 的 Apex 界面设计简洁明了,不向后兼容 SQL*Plus。
您遇到的是 SQLplus 的文本替换机制(以及实现相同扩展的工具)。
您可以通过以下方式关闭它:
SET DEF OFF
或者您可以切换到不同的字符(本例中的加号):
SET DEF +
据我所知,您使用的 Oracle 工具没有实现 SQLplus 扩展。但是 SQL Developer(来自 Oracle 的免费 GUI 工具)可以。