用了临时表的存储过程,返回不了数据

mugua604 2020-04-22 02:19:42
CREATE OR REPLACE PROCEDURE SP_HSA_Get_Income0421_TEST(
DATA1 OUT SYS_REFCURSOR) IS
BEGIN

DECLARE V_STR VARCHAR2(4000);
TABLECOUNT NUMBER;
TEMP_COUNT NUMBER;
V_TEMP_TABLENAME_01 VARCHAR(20);
V_TEMP_TABLENAME_02 VARCHAR(20);
V_STR_CLOB clob;
V_STR_01 VARCHAR2(4000);

BEGIN
V_TEMP_TABLENAME_01 := 'CT_'||SUBSTR(SYS_GUID(),1,8);

SELECT COUNT(1) INTO TABLECOUNT FROM USER_TABLES WHERE TABLE_NAME =V_TEMP_TABLENAME_01;

IF TABLECOUNT>0 THEN
V_STR :='TRUNCATE TABLE '||V_TEMP_TABLENAME_01;
EXECUTE IMMEDIATE V_STR;
V_STR :='DROP TABLE '||V_TEMP_TABLENAME_01;
EXECUTE IMMEDIATE V_STR;
END IF;
EXECUTE IMMEDIATE '
CREATE GLOBAL TEMPORARY TABLE '||V_TEMP_TABLENAME_01||' ON COMMIT PRESERVE ROWS AS
SELECT 1 AS AA, 2 AS BB FROM DUAL';

V_STR_01:='SELECT * FROM '||V_TEMP_TABLENAME_01;

OPEN DATA1 FOR V_STR_01;

SELECT COUNT(1) INTO TABLECOUNT FROM USER_TABLES WHERE TABLE_NAME =V_TEMP_TABLENAME_01;
IF TABLECOUNT>0 THEN
V_STR :='TRUNCATE TABLE '||V_TEMP_TABLENAME_01;
EXECUTE IMMEDIATE V_STR;
V_STR :='DROP TABLE '||V_TEMP_TABLENAME_01;
EXECUTE IMMEDIATE V_STR;
END IF;

END;
END SP_HSA_Get_Income0421_TEST;


DATA1 得不到数据,请各位大侠帮忙,看下是不是哪里写错了,或者是不是PLSQL通过临时表的方式有问题!
...全文
248 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Kings_cool 2020-04-25
  • 打赏
  • 举报
回复
sqlsevr 使用临时表必须要起别名,oracle不需要
卖水果的net 2020-04-24
  • 打赏
  • 举报
回复
引用 7 楼 mugua604 的回复:
[quote=引用 6 楼 卖水果的net 的回复:]
按你的方式,会不会导致这个存储过程同时被调用时,数据会错乱!导致取出的数据有问题? 在SQL SERVER里面 #TEMP这种临时表,每次用完就自动删除![/quote] 不会的,oracle 的临时表,各个会话的数据是隔离的,也就是 会话1 无论如何也是查不S2 的数据的。 反而是这种动态创建的方式,在并发时会互相影响。 PS: Oracle 和 SQL Server 在临时表的使用上区别还是很大的。
mugua604 2020-04-24
  • 打赏
  • 举报
回复
引用 6 楼 卖水果的net 的回复:
SYS_REFCURSOR 类型的游标属于弱类型,在OPEN时,才会去执行这个实际的语句,也就是说才去做语法检查。 后面的你删除掉了要引用的,肯定就查不到了,并且报一个表不存在的错误。 实际上,临时表的使用标准应该是这样:先在数据库中把临时表建好,而不是在存储中去动态去创建它。 建议参考一下 1# 和5# 回复。
按你的方式,会不会导致这个存储过程同时被调用时,数据会错乱!导致取出的数据有问题? 在SQL SERVER里面 #TEMP这种临时表,每次用完就自动删除!
卖水果的net 2020-04-24
  • 打赏
  • 举报
回复
SYS_REFCURSOR 类型的游标属于弱类型,在OPEN时,才会去执行这个实际的语句,也就是说才去做语法检查。 后面的你删除掉了要引用的,肯定就查不到了,并且报一个表不存在的错误。 实际上,临时表的使用标准应该是这样:先在数据库中把临时表建好,而不是在存储中去动态去创建它。 建议参考一下 1# 和5# 回复。
  • 打赏
  • 举报
回复
因为你把这个表删除了,游标获取数据,是你把他打开的时候才会获取数据。和视图差不多的,不会存数据的。报的错是找不到表
riven2011 2020-04-23
  • 打赏
  • 举报
回复
再加一个过程用来drop临时表,你将现在过程临时表的表名作为出参,使用完游标数据以后,然后再掉drop过程
mugua604 2020-04-23
  • 打赏
  • 举报
回复
有大侠提供思路吗
mugua604 2020-04-22
  • 打赏
  • 举报
回复
我现在这个写法,DATA1 获取不到对应的值,这个是什么原因呢!
riven2011 2020-04-22
  • 打赏
  • 举报
回复
会话临时表,会话结束后会自动清理数据,不需要程序控制truncate 。
当你使用游标的时候,要进行语义检查,发现表对象不存在,就会报错。

17,382

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧