oracle临时会话表在存储过程中的使用

问题:

在将db2的存储过程转换为oracle的过程中,涉及到临时会话表,会出现问题:

具体描述:

原db2中的存储过程涉及临时会话表的部分:
--创建临时会话表
DECLARE GLOBAL TEMPORARY TABLE COL_NAMES(
id integer,
COLNAMES varchar(50)
)WITH REPLACE NOT LOGGED on commit preserve ROWS ;
DELETE FROM SESSION.COL_NAMES;
commit;
--向临时会话表中插入数据
INSERT INTO SESSION.COL_NAMES values(1, 'ARRIVAL');
INSERT INTO SESSION.COL_NAMES values(2, 'SORTOUT');
INSERT INTO SESSION.COL_NAMES values(3, 'RBACK');
INSERT INTO SESSION.COL_NAMES values(4, 'TRANSOUT');
INSERT INTO SESSION.COL_NAMES values(5, 'TRANSBACK');
commit;
--游标中用到临时会话表
FOR c2 AS loop2 CURSOR WITH HOLD FOR

SELECT ID,COLNAMES FROM SESSION.COL_NAMES ORDER BY id WITH ur
DO
execute immediate replace(v_exec_0,'ARRIVAL',c2.COLNAMES);
END FOR;

在oracle中进行转换:
CREATE OR REPLACE PROCEDURE K_TJBS_D IS
--创建游标,使用到了临时会话表
CURSOR csr3 is

SELECT ID,COLNAMES FROM COL_NAMES ORDER BY id ;
BEGIN

--创建临时会话表
temp_tab_str := 'create GLOBAL TEMPORARY TABLE COL_NAMES(id integer, COLNAMES varchar2(50)) on commit preserve ROWS ';
execute immediate temp_tab_str;
DELETE FROM COL_NAMES;
commit;
--向临时会话表中插入数据
INSERT INTO COL_NAMES values(1, 'ARRIVAL');
INSERT INTO COL_NAMES values(2, 'SORTOUT');
INSERT INTO COL_NAMES values(3, 'RBACK');
INSERT INTO COL_NAMES values(4, 'TRANSOUT');
INSERT INTO COL_NAMES values(5, 'TRANSBACK');
commit;
--使用游标
FOR c1 in csr3 loop

execute immediate replace(v_exec_0,'ARRIVAL',c2.COLNAMES);
END loop;
这样转换,编译不会通过,会在创建游标csr3的时候报:表或视图COL_NAMES不存在的错误,oracle版本:oracle 11g
请问:在这种情况下,oracle应该中如何转换,多谢!

4个回答

一 临时表语法
 
    临时表只在Oracle 8i 以及以上产品中支持。  
    语法:
create global temporary table 临时表名 on commit preserve/delete rows

--preserve:SESSION级的......
答案就在这里:ORACLE 在存储过程中使用临时表
----------------------Hi,地球人,我是问答机器人小S,上面的内容就是我狂拽酷炫叼炸天的答案,除了赞同,你还有别的选择吗?

请问楼主用的那个版本的Oracle数据库,8i? 9i? 10g? 11g? 12g?

zeh123456
zeh123456 sorry,忘说了,11g
4 年多之前 回复

sorry你说了,我没看仔细....你能把报错的详细信息贴出来吗?方便大家查错

报的错:表或视图COL_NAMES不存在,因为在创建游标的时候,他会找COL_NAMES这个临时会话表,但是这个临时会话表在begin 后中创建的,所以会报错。我现在用了替代方法,把临时会话表落地了,错误就没了。我想知道如何用临时会话表实现这种转换

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐