in子句中的数组

时间:2015-03-05 18:01:07

标签: sql oracle

我有几个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?,但这并不适用于

我搜索了几个地方,但似乎没有什么是我想要的

由于

1 个答案:

答案 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