日期:2014-05-17  浏览次数:21064 次

关于oracle 临时表与游标的问题??
我在oracle 92的存储过程中 ,通过下面的方式,创建一个临时表,并向表中添加了数据,我在创建这个临时表中通过语句对此临时表进行检查,如果表存在直接插入数据,否则创建这个临时表,
str:='CREATE GLOBAL TEMPORARY TABLE temptest ( 
     RQ date not null, 
     ZS VARCHAR2(100)) 
     ON COMMIT DELETE ROWS';
     execute immediate str;

在同一个存储过程中,我还定义了一个游标,来查询这个临时表中的数据,但当临时表尚未创建或删除,下面的代码将出错,找不到这个临时表

DECLARE 
      CURSOR L_RECORD IS SELECT * FROM temptest;--此处哪果临时表不存在出错
                 da L_RECORD%ROWTYPE;
     BEGIN
       FOR da IN L_RECORD LOOP
          SELECT COUNT(*) INTO countzjs FROM A010 A INNER JOIN EX_JQZDAFB JQZ ON A.JQZDM=JQZ.JQZDM
          WHERE JQZ.QKDM=p_QKDM AND tcrq<=da.rq;
       END LOOP;
    END;

请问能否将临时表的名称 通过一个变量进行解决。

后来我通过
TYPE ResultData IS REF CURSOR;
  L_RECORD ResultData;
定义游标,

  strTemp:='SELECT * FROM temptest';
          OPEN L_RECORD for strTemp;
     BEGIN
       LOOP
         FETCH L_RECORD INTO rq;---------此处不知怎么写,没有值,
                 EXIT WHEN L_RECORD%NOTFOUND; 
                   DBMS_OUTPUT.put_line(rq);
              END LOOP;
       close L_RECORD;
    END;
如果按上面的方式可以解决问题,但不知怎么通过Fetch 循环取出 rq这个值,
------最佳解决方案--------------------

SQL> create or replace procedure p_t
  2  is
  3  str varchar2(4000):='CREATE GLOBAL TEMPORARY TABLE temptest (
  4    RQ date not null,
  5    ZS VARCHAR2(100))
  6    ON COMMIT DELETE ROWS';
  7  strTemp varchar2(1000) :='SELECT * FROM temptest';
  8  TYPE ResultData IS REF CURSOR;
  9  L_RECORD ResultData;
 10  type t_r is record(RQ date,ZS VARCHAR2(100));
 11  v_t t_r;
 12  v_c integer:=0;
 13  begin
 14   execute immediate 'select count(*) from user_tables where table_name=upper(:v)'
 15   into v_c using 'temptest';
 16   if v_c=0 then
 17   execute immediate str;
 18   end if;
 19   execute immediate 'inser