如果select返回多个记录,则需要使用PLSQL变量。无需收集/游标。

时间:2017-01-18 14:41:47

标签: sql plsql

我需要使用PLSQL变量来保存三个以上的值。我不想收集或光标。以下是要求,v_cnt需要为9而不是' 0'。请帮助解决这个问题。

declare 
v_column VARCHAR2(200);
v_cnt number :=0;
begin
  select (SELECT listagg(TABLE_NAME,',')within group(order by table_name) FROM ALL_TABLES where owner in 'SYS' AND  rownum<10 )
  into v_column 
  from dual;

  select count(*) into v_cnt from all_tables where table_name in(v_column);
  DBMS_OUTPUT.PUT_LINE('v_column=' || v_column||'  VC-nt : = '||v_cnt);
end;

v_column将以逗号分隔值。我需要在运算符中传递它,但v_column整个值被视为单值。有没有办法将它作为IN运算符内的单独9值传递。

2 个答案:

答案 0 :(得分:0)

鉴于你将在多个sql语句中使用第一个查询返回的值(假设它们不能以某种方式组合),我会创建一个global temporary table (GTT),例如:

CREATE GLOBAL TEMPORARY TABLE gtt_reuse_table_names (table_name varchar2(30))
ON COMMIT DELETE ROWS;

然后在您的过程中的查询中引用它,例如:

declare
  v_cnt integer;
begin
  insert into gtt_reuse_table_names (table_name)
  SELECT table_name
  FROM   ALL_TABLES where owner in 'SYS'
  AND    rownum<10;

  select count(*)
  into   v_cnt
  from   all_tables
  where  table_name in (gtt_reuse_table_names);

  ...
end;
/

答案 1 :(得分:0)

我从各种搜索中得到了答案,

我使用以下声明,

 select count(*) into v_cnt from all_tables where ','||v_column||',' like '%,'||table_name||',%' ;

然后返回'9'。

谢谢。