在SQL服务器中,我总是有一组诊断脚本,并始终确保使用标识符声明变量,以便我的其他选择和更新可以利用它们。我在Oracle中采用这种模式时遇到了麻烦。
我可能有4或5个选择查询,然后还有一些我可能会在验证结果后取消注释的更新。我想在输出中看到select查询的结果。
我正在使用SQL Developer。
首先我尝试使用DEFINE
块,但似乎必须与BEGIN / END块配对,一旦查询在块内,看起来查看结果变得很麻烦。我见过的例子包括设置光标然后迭代光标以打印结果,或者你必须打印更加麻烦的单个值。
所以我尝试使用变量,因为我可以在不使用declare / begin / end的情况下引用它们,但是我在设置变量的值时遇到了麻烦:
variable customerid number;
customerid := 1234;
但是我收到了这个错误:
从命令行中的错误5开始 - customerid:= 1234错误 report - 未知命令
我也试过
select t.customerid into :customerid
from customer t
where t.customerid = 1234
并获得:
SQL错误:ORA-01006:绑定变量不存在 01006. 00000 - “绑定变量不存在”
我的目标是将我的ID声明设置在我设置值的顶部,并且能够运行脚本并且所有我的adhoc选择都出现在输出中。
答案 0 :(得分:2)
您需要在PL / SQL上下文中设置绑定变量,使用execute
syntactic wrapper:
variable customerid number;
exec :customerid := 1234;
或稍微明确一点:
variable customerid number;
begin
:customerid := 1234;
end;
/
(几乎)等效,但如果你想设置多个变量,可能会更方便。您也可以尝试从查询中填充绑定变量,但这也需要在PL / SQL上下文中:
begin
select t.customerid into :customerid
from customer t
where t.customerid = 1234;
end;
/
注意customerid
之前的冒号,表示它是一个绑定变量,在所有这些中。以后引用它时需要它,例如在SQL查询中(不需要在PL / SQL块中):
select * from customer where customerid = :customerid;
您可以稍后在更新中使用相同的机制。使用冒号的例外是你想要只看到变量的值;你可以select :customerid from dual
,但there is also the ability to
print customerid
如果你的变量是refcursor
,那就更有用了。
define
是一种完全不同的机制,而不是绑定变量。您也不需要使用PL / SQL块:
define customerid=1234
select * from customer where customerid = &customerid;
注意这次没有冒号。另请注意,如果您的变量是一个字符串,则在使用它时需要将其括在引号中:
define name=aaron
select * from users where first_name = '&name';
您还可以使用the new_value
syntax使用查询结果填充替换变量。