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

问题描述

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应该中如何转换,多谢!

解决方案

一 临时表语法
?
?? ?临时表只在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 后中创建的,所以会报错。我现在用了替代方法,把临时会话表落地了,错误就没了。我想知道如何用临时会话表实现这种转换

时间: 2024-11-18 07:17:53

select-oracle临时会话表在存储过程中的使用的相关文章

Oracle 临时事务表 全局临时表_global temporary table

所有的操作都在一个事务里,事务提交后,此表清空,特别适合做插入删除频率特别高的临时表操作,比如插入完数据就开始查询,查询完就删掉等,用完就扔! 临时表分事务级临时表和会话级临时表. 事务级临时表只对当前事务有效,通过语句:ON COMMIT DELETE ROWS 指定. 会话级临时表对当前会话有效,通过语句:ON COMMIT PRESERVE ROWS语句指定. -- Create table create global temporary table WFM_TMP_WORKLIST (

QQ如何屏蔽临时会话?屏蔽临时会话的方法

1.在QQ中登录之后我们如下图点击红框处,再点击"打开系统设置" 如下图所示. 2.在系统设置的对话框中 点击"权限设置" 按钮 3.现在我们会看到"临时会话"是未选择中的,现在我们只要把"不接收任何临时会话消息"选中即可. 4.如果我们只要是不接受群里那一个人的,我们可以直接在群成员页面右击,然后点击"屏蔽此人发言"即可. 5.如果现在又不想屏蔽那个人的临时会话了,我们又可进入"系统设置&quo

oracle存储过程中的select与参数详细说明

  create or replace procedure pro_test is begin select * from t_test; end pro_test; 这个存储过程正确吗? 昨天因为这个,耽误了好久(在一个存储过程中用了select语句,但既没有用游标也没有用into). 在存储过程(oracle数据库教程)中如果用了select语句,要么使用"select into 变量"语句要么使用游标,oracle不支持单独的select语句(如表述有误请指出). select

Oracle存储过程中的角色

角色(数据库权限集)与存储过程.函数和数据包之间的交互方式是Oracle安全模型中最难以处理的一个部分.Oracle中的对象权限可以直接或通过角色间接授予用户. 假设一个HR用户向用户ABEL授予EMPLOYEES表的一些许可: GRANT select, insert, update, delete 这个语句直接把上述四个权限授予给用户ABEL.另一方面,假设一名HR用户这样做: GRANT select, insert, update, delete ON employees TO hr_r

Oracle存储过程中使用临时表

原文地址: http://sosuny.javaeye.com/blog/551006   一.Oracle临时表知识   在Oracle中,临时表分为SESSION.TRANSACTION两种,SESSION级的临时表数据在整个SESSION都存在,直到结束此次SESSION:而 TRANSACTION级的临时表数据在TRANACTION结束后消失,即COMMIT/ROLLBACK或结束SESSION都会清除 TRANACTION临时表数据.  1) 会话级临时表 示例  1创建 Sql代码 

如何在Oracle存储过程中拥有role权限

我们知道,用户拥有的role权限在存储过程是不可用的.如: SQL> select * from dba_role_privs where grantee='SUK'; GRANTEE GRANTED_ROLE ADMIN_OPTION DEFAULT_ROLE------------ ------------SUK DBA NO YESSUK CONNECT NO YESSUK RESOURCE NO YES 用户SUK拥有DBA这个role 再创建一个测试存储过程: create or re

在存储过程中动态创建表

在尝试做在线考试系统的过程中,为了管理每个学生的考试信息,就考虑为每个学生创建以学号命名的临时数据表. 在存储过程中动态创建表如果不使用参数的话很好创建.方法如下: ALTER procedure [dbo].[ZXKS_GETSCORE] AS begin transaction --创建临时表,直接命名 create table temp_tablename ( id int primary key, da varchar(300), fs int ) declare @count int

如何在oracle存储过程中进行简单动态查询

在存储过程中做简单动态查询代码 ,例如: CREATE OR REPLACE procedure ZXM_SB_GZ_GET (p_table in varchar2, p_name in varchar2, p_value in varchar2, outpara out lntxdba.zxm_pag_cs_power.c_type ) as begin declare wherevalue varchar2(200): begin wherevalue:=select * from ||p

默认情况下,不使用of子句表示在select所有的数据表中加锁(转)

Select -forupdate语句是我们经常使用手工加锁语句.通常情况下,select语句是不会对数据加锁,妨碍影响其他的DML和DDL操作.同时,在多版本一致读机制的支持下,select语句也不会被其他类型语句所阻碍.   借助for update子句,我们可以在应用程序的层面手工实现数据加锁保护操作.本篇我们就来介绍一下这个子句的用法和功能.   下面是采自Oracle官方文档<SQLLanguage Reference>中关于for update子句的说明:(请双击点开图片查看)