问题描述
- 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 FORSELECT 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 isSELECT 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 loopexecute immediate replace(v_exec_0,'ARRIVAL',c2.COLNAMES);
END loop;
这样转换,编译不会通过,会在创建游标csr3的时候报:表或视图COL_NAMES不存在的错误,oracle版本:oracle 11g
请问:在这种情况下,oracle应该中如何转换,多谢!
解决方案
一 临时表语法
?
?? ?临时表只在Oracle?8i?以及以上产品中支持。??
?? ?语法:
create global temporary table 临时表名 on commit preserve/delete rows
--preserve:SESSION级的......
答案就在这里:ORACLE 在存储过程中使用临时表
----------------------
解决方案二:
请问楼主用的那个版本的Oracle数据库,8i? 9i? 10g? 11g? 12g?
解决方案三:
sorry你说了,我没看仔细....你能把报错的详细信息贴出来吗?方便大家查错
解决方案四:
报的错:表或视图COL_NAMES不存在,因为在创建游标的时候,他会找COL_NAMES这个临时会话表,但是这个临时会话表在begin 后中创建的,所以会报错。我现在用了替代方法,把临时会话表落地了,错误就没了。我想知道如何用临时会话表实现这种转换