参数化特殊脚本

时间:2017-04-05 22:28:48

标签: oracle oracle-sqldeveloper oracle12c

在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选择都出现在输出中。

1 个答案:

答案 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,那就更有用了。

对于substitution variables而言,

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使用查询结果填充替换变量。