動態sql查詢結果多行的處理情況

lihy114發表於2013-09-29

CREATE OR REPLACE PROCEDURE DATACODE
IS
  cursor cur_table is select table_name from tab_name;
  v_tablename varchar2(20);
  v_count number(5);
  v_sql varchar2(1000);
  no_table exception;   --定義一個異常
  pragma exception_init(no_table,-00942);   --查詢中如果表不存在,oracle報的錯誤
begin
  select count(*) into v_count from tab_name;
  open cur_table;
  fetch cur_table into v_tablename;
     for i in 1..v_count loop
         v_sql :='insert into remark SELECT A.ID "ID",A.MC "名稱",A.COMP "單位代號",C.NAME "單位",'''||v_tablename||''' FROM '||v_tablename||' A,
    (SELECT COMPID FROM COMPANYINFO
      CONNECT BY PRIOR COMPID=PCOMPID
        START WITH COMPID=(SELECT MAX(CSZ) FROM XTCS WHERE CSMC=''COMPID_XNZXTOP'')) B,
        COMPANYINFO C
     WHERE A.COMPID=B.COMPID(+) AND B.COMPID IS NULL AND A.COMPID=C.COMPID';
         begin
   execute immediate v_sql;          --對於查詢的多行資料,需要建立臨時表儲存資料,執行sql的語句與單行查詢不同
       exception
                    when no_table then
                    insert into remark values(null,null,null,null,v_tablename);     --如果表不存在的話,僅僅插入表名,其他列為空值
                    commit;
             end;
             commit;
             fetch cur_table into v_tablename;
     end loop;
  close cur_table;      
end;

在這個例子中,需要注意的是兩個地方:一個是如何將變數的值插入到表中;另外一個是如果處理返回多條查詢的動態sql

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28803801/viewspace-773586/,如需轉載,請註明出處,否則將追究法律責任。

相關文章