Oracle 参数化临时脚本

Oracle 参数化临时脚本,oracle,oracle-sqldeveloper,oracle12c,Oracle,Oracle Sqldeveloper,Oracle12c,在SQL server中,我总是有一组诊断脚本,并且总是确保使用标识符声明变量,以便我的其他选择和更新能够利用它们。我在Oracle中采用此模式时遇到困难 我可能有4个或5个select查询,然后还有一些更新,在验证结果后可能会取消注释。我想在输出中查看select查询的结果 我使用的是SQLDeveloper 首先,我尝试使用一个DEFINE块,但它似乎必须与BEGIN/END块配对,而且一旦查询位于块内,查看结果似乎就变得很麻烦。我所看到的例子要么涉及设置一个光标,然后在光标上迭代以打印结果

在SQL server中,我总是有一组诊断脚本,并且总是确保使用标识符声明变量,以便我的其他选择和更新能够利用它们。我在Oracle中采用此模式时遇到困难

我可能有4个或5个select查询,然后还有一些更新,在验证结果后可能会取消注释。我想在输出中查看select查询的结果

我使用的是SQLDeveloper

首先,我尝试使用一个
DEFINE
块,但它似乎必须与BEGIN/END块配对,而且一旦查询位于块内,查看结果似乎就变得很麻烦。我所看到的例子要么涉及设置一个光标,然后在光标上迭代以打印结果,要么必须打印单个值,这就更麻烦了

因此,我尝试使用变量,因为我可以在不声明/开始/结束的情况下引用它们,但设置变量的值时遇到问题:

variable customerid number;
customerid := 1234;
但我得到了这个错误:

从命令中的第5行开始出错-customerid:=1234错误 报告-未知命令

我也试过了

select t.customerid into :customerid
from customer t
where t.customerid = 1234
并获得:

SQL错误:ORA-01006:绑定变量不存在 100600000-“绑定变量不存在”


我的目标是将我的id声明放在我设置值的顶部,并且能够运行脚本,并且我的所有临时选择都显示在输出中。

您需要在PL/SQL上下文中设置绑定变量,可以使用:

或者更明确一点:

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块中)中,您需要它:

您可以在以后的更新中使用相同的机制。使用冒号的例外情况是,如果您只想查看变量的值;您可以
从dual
中选择:customerid,但是

如果变量是
refcursor
,则这一点更有用


define
是一种完全不同的机制,用于而不是绑定变量。您也不需要为此使用PL/SQL块:

define customerid=1234
select * from customer where customerid = &customerid;
请注意,这次没有冒号。还要注意,如果变量是字符串,则在使用时需要将其括在引号中:

define name=aaron
select * from users where first_name = '&name';

您还可以使用查询结果填充替换变量。

您需要在PL/SQL上下文中设置绑定变量,可以使用:

或者更明确一点:

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块中)中,您需要它:

您可以在以后的更新中使用相同的机制。使用冒号的例外情况是,如果您只想查看变量的值;您可以
从dual
中选择:customerid,但是

如果变量是
refcursor
,则这一点更有用


define
是一种完全不同的机制,用于而不是绑定变量。您也不需要为此使用PL/SQL块:

define customerid=1234
select * from customer where customerid = &customerid;
请注意,这次没有冒号。还要注意,如果变量是字符串,则在使用时需要将其括在引号中:

define name=aaron
select * from users where first_name = '&name';

您还可以使用查询结果填充替换变量。

感谢Alex澄清了语法和术语。
结束后的尾随
/
在能够使用其他选择跟随开始/结束块方面起了很大的作用。这叫什么?@AaronLS-*8-)另见和。(这些都是指向SQL*Plus文档的链接,但从设计上看,大多数链接都适用于SQL Developer,一般来说,SQL Developer的文档记录较少……)感谢Alex澄清了语法和术语。
结束后的尾随
/
在能够使用其他选择跟随开始/结束块方面起了很大的作用。这叫什么?@AaronLS-*8-)另见和。(这些都是指向SQL*Plus文档的链接,但从设计上看,大多数链接都适用于SQL Developer,而SQL Developer的文档通常不太完善……)