oracle关联数组存在于case语句导致编译失败的情况

时间:2013-05-23 17:12:42

标签: sql oracle plsql

这是一个假设的例子。实际问题涉及基于值更新各种列(如果它们存在于关联数组中)。以下抛出ORA-06550和ORA-01747。请帮助修复错误。

declare
   type MONTH_TYPE is table of varchar2(20) index by binary_integer;

   month_table   MONTH_TYPE;
   mon varchar2(20);
 begin
   month_table(1) := 'Jan';
   month_table(2) := 'Feb';

   select case when month_table.exists(1) then 'found' else 'not found' end into mon from dual;
 end;

1 个答案:

答案 0 :(得分:3)

您无法从SQL语句调用PL / SQL exists函数。如果需要,您可以在集合中引用

declare
   type MONTH_TYPE is table of varchar2(20) index by binary_integer;
   month_table   MONTH_TYPE;
   mon varchar2(20);
 begin
   month_table(1) := 'Jan';
   month_table(2) := 'Feb';
   select case when month_table(1)='Jan' then 'found' else 'not found' end
        into mon from dual;
end;

或者您可以在PL / SQL中使用exists

declare
   type MONTH_TYPE is table of varchar2(20) index by binary_integer;

   month_table   MONTH_TYPE;
   mon varchar2(20);
 begin
   month_table(1) := 'Jan';
   month_table(2) := 'Feb';

   mon := case when month_table.exists(1) then 'found' else 'not found' end;
end;

从你的评论中听起来像数据库类型可能是要走的路:

SQL> create type MONTH_TYPE is table of varchar2(20);

然后您可以在SQL中选择:

declare
   month_table   MONTH_TYPE := MONTH_TYPE();
   mon varchar2(20);
 begin
   month_table.extend;
   month_table(1) := 'Jan';
   month_table.extend;
   month_table(2) := 'Feb';

   update some_table
   set x = 1
   where month in (select column_value from table(month_table));
end;