关于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