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