我有几个sqls,我作为大型db脚本的一部分运行。通常情况会在几个平方上重复出现。例如
update phone_numbers set num = 'abc' where id not in (1,2,4,5,6,8);
update fax_numbers set num = 'abc' where id not in (1,2,4,5,6,8);
update email_add set val = 'abc' where id not in (1,2,4,5,6,8);
我的问题是我不断重复not in子句中的值。
如何将这些麻木移动到变量中然后应用于每个sql。像
这样的东西my_var = (1,2,4,5,6,8);
update phone_numbers set num = 'abc' where id not in @my_var;
update fax_numbers set num = 'abc' where id not in @my_var;
update email_add set val = 'abc' where id not in @my_var;
如果有帮助,SQL正在Oracle上运行?我之前用一个参数完成了这个,但没有一个数组。
我见过这个Oracle PL/SQL - How to create a simple array variable?,但这并不适用于
我搜索了几个地方,但似乎没有什么是我想要的
由于
答案 0 :(得分:4)
如果您使用的是SQL * Plus或SQL Developer,则可以定义替换变量:
define my_var = '1,2,4,5,6,8'
update phone_numbers set num = 'abc' where id not in (&my_var);
update fax_numbers set num = 'abc' where id not in (&my_var);
update email_add set val = 'abc' where id not in (&my_var);
每个语句都会对值进行简单替换(顾名思义);如果您有set verify on
,那么您会看到发生这种情况:
old:update phone_numbers set num = 'abc' where id not in (&my_var)
new:update phone_numbers set num = 'abc' where id not in (1,2,4,5,6,8)
您也可以将语句包装在PL / SQL块中,并使用a built-in collection type来保存值:
declare
my_var sys.odcinumberlist;
begin
my_var := sys.odcinumberlist(1,2,4,5,6,8);
update phone_numbers set num = 'abc'
where id not in (select column_value from table (my_var));
update fax_numbers set num = 'abc'
where id not in (select column_value from table (my_var));
update email_add set val = 'abc'
where id not in (select column_value from table (my_var));
end;
/
...除非您自己显示SQL%ROWCOUNT,否则会更长并隐藏更新计数,但可以在任何客户端使用。
因为这是使用varray类型,所以您可以使用集合方法。所以如果你现在在PL / SQL块中有这样的东西::
if x in (1,2,4,5,6,8) then
你可以改为做;
if my_var.exists(x) the