0

如果我从 Pl-sql 命令提示符运行命令以一一插入多行而无需再次重写语句,我们可以使用&运算符,如下图所示。 在此处输入图像描述

如果我为相同目的使用 GUI 方法,我必须使用:操作符,如下图所示 在此处输入图像描述

现在我的问题是->为什么我们不能&在 GUI 中使用运算符,如果我们使用它会出错。

4

3 回答 3

3

&运算符不是绑定方法 - 它是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
于 2012-12-06T10:49:07.840 回答
1

这两种绑定变量的方法都不是 SQL 引擎的一部分:它们都是客户端的便利。由于客户不同,它们具有不同的便利功能。

您所说的“Pl-sql 命令提示符”不是这样的:它是客户端工具SQL*Plus 的提示符,而不是像过程语言 PL/SQL 那样的数据库的一部分。

您正在使用的另一个工具类似于 APEX 中的 SQL 工作表。我想如果我猜测一下,我会说他们选择了 ':' 而不是 '&',因为它是多年后开发的,当时似乎是更自然的选择。Oracle Express Edition 的 Apex 界面设计简洁明了,不向后兼容 SQL*Plus。

于 2012-12-06T10:40:44.480 回答
1

您遇到的是 SQLplus 的文本替换机制(以及实现相同扩展的工具)。

您可以通过以下方式关闭它:

SET DEF OFF

或者您可以切换到不同的字符(本例中的加号):

SET DEF +

据我所知,您使用的 Oracle 工具没有实现 SQLplus 扩展。但是 SQL Developer(来自 Oracle 的免费 G​​UI 工具)可以。

于 2012-12-06T10:40:48.113 回答