问题描述
嗨,汤姆,下面是我们的问题
程序成功执行后,应删除临时表中的数据,但我们仍从临时表中获取旧数据。
查询-
----------
声明
getdatabasetype SYS_REFCURSOR;
l_databasetype varchar(200);
开始
开始
插入TT_GAURAV
从refclientdatabaseenum中选择databasetype;
结束;
打开getdatabasetype,用于从TT_GAURAV中选择databasetype;
dbms_sql.return_result(getdatabasetype);
提交;
结束;
-----------------------
我们用下面提到的两种情况执行了上述查询。
场景1 :-提交删除行
执行查询时没有输出数据。
PL/SQL过程成功完成。
场景2 :-提交保留行
第一次执行查询时,下面是输出。
数据类型
-----------------------------------
客户创建
IPO
MF
MTS
NBFC
NSDL
其他
PMS
政策
结构
交易
独特
CDSL
选择了13行。
PL/SQL过程成功完成。
第二次执行查询时,以下是具有13个先前记录的输出。
数据类型
----------------------------------
客户创建
IPO
MF
MTS
NBFC
NSDL
其他
PMS
政策
结构
交易
独特
CDSL
客户创建
IPO
MF
MTS
NBFC
NSDL
其他
PMS
政策
结构
交易
独特
选择了26行。
1) 每次执行时,查询应仅返回13条记录。
请建议我们应该使用哪种场景,在哪种情况下
程序成功执行后,应删除临时表中的数据,但我们仍从临时表中获取旧数据。
查询-
----------
声明
getdatabasetype SYS_REFCURSOR;
l_databasetype varchar(200);
开始
开始
插入TT_GAURAV
从refclientdatabaseenum中选择databasetype;
结束;
打开getdatabasetype,用于从TT_GAURAV中选择databasetype;
dbms_sql.return_result(getdatabasetype);
提交;
结束;
-----------------------
我们用下面提到的两种情况执行了上述查询。
场景1 :-提交删除行
执行查询时没有输出数据。
PL/SQL过程成功完成。
场景2 :-提交保留行
第一次执行查询时,下面是输出。
数据类型
-----------------------------------
客户创建
IPO
MF
MTS
NBFC
NSDL
其他
PMS
政策
结构
交易
独特
CDSL
选择了13行。
PL/SQL过程成功完成。
第二次执行查询时,以下是具有13个先前记录的输出。
数据类型
----------------------------------
客户创建
IPO
MF
MTS
NBFC
NSDL
其他
PMS
政策
结构
交易
独特
CDSL
客户创建
IPO
MF
MTS
NBFC
NSDL
其他
PMS
政策
结构
交易
独特
选择了26行。
1) 每次执行时,查询应仅返回13条记录。
请建议我们应该使用哪种场景,在哪种情况下
专家解答
当我们提交时,临时表的段被有效地删除,因此在获取时会出现错误
您可以通过推迟提交直到完成提取来解决此问题,例如
如果这是不可行的,那么您可以在每次运行时都使用显式截断自己控制表内容,例如
SQL> create global temporary table t ( x int ); Table created. SQL> SQL> Declare 2 getdatabasetype SYS_REFCURSOR; 3 l_databasetype varchar(200); 4 BEGIN 5 insert into t 6 select rownum from dual connect by level <= 10; 7 open getdatabasetype for select x from t; 8 dbms_sql.return_result(getdatabasetype); 9 Commit; 10 END; 11 / PL/SQL procedure successfully completed. ResultSet #1 ERROR: ORA-08103: object no longer exists复制
您可以通过推迟提交直到完成提取来解决此问题,例如
SQL> Declare 2 getdatabasetype SYS_REFCURSOR; 3 l_databasetype varchar(200); 4 BEGIN 5 insert into t 6 select rownum from dual connect by level <= 10; 7 open getdatabasetype for select x from t; 8 dbms_sql.return_result(getdatabasetype); 9 --Commit; 10 END; 11 / PL/SQL procedure successfully completed. ResultSet #1 X ---------- 1 2 3 4 5 6 7 8 9 10 10 rows selected. SQL> SQL> commit; Commit complete. SQL> select * from t; no rows selected复制
如果这是不可行的,那么您可以在每次运行时都使用显式截断自己控制表内容,例如
SQL> Declare 2 getdatabasetype SYS_REFCURSOR; 3 l_databasetype varchar(200); 4 BEGIN 5 execute immediate 'truncate table t'; 6 insert into t 7 select rownum from dual connect by level <= 10; 8 open getdatabasetype for select x from t; 9 dbms_sql.return_result(getdatabasetype); 10 END; 11 / PL/SQL procedure successfully completed. ResultSet #1 X ---------- 1 2 3 4 5 6 7 8 9 10 10 rows selected. SQL> SQL> Declare 2 getdatabasetype SYS_REFCURSOR; 3 l_databasetype varchar(200); 4 BEGIN 5 execute immediate 'truncate table t'; 6 insert into t 7 select rownum from dual connect by level <= 10; 8 open getdatabasetype for select x from t; 9 dbms_sql.return_result(getdatabasetype); 10 END; 11 / PL/SQL procedure successfully completed. ResultSet #1 X ---------- 1 2 3 4 5 6 7 8 9 10 10 rows selected.复制
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
【专家有话说第五期】在不同年龄段,DBA应该怎样规划自己的职业发展?
墨天轮编辑部
1450次阅读
2025-03-13 11:40:53
Oracle RAC ASM 磁盘组满了,无法扩容怎么在线处理?
Lucifer三思而后行
879次阅读
2025-03-17 11:33:53
RAC 19C 删除+新增节点
gh
539次阅读
2025-03-14 15:44:18
2月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
497次阅读
2025-03-13 14:38:19
Oracle 如何修改 db_unique_name?强迫症福音!
Lucifer三思而后行
425次阅读
2025-03-12 21:27:56
Oracle DataGuard高可用性解决方案详解
孙莹
366次阅读
2025-03-26 23:27:33
墨天轮个人数说知识点合集
JiekeXu
313次阅读
2025-04-01 15:56:03
XTTS跨版本迁移升级方案(11g to 19c RAC for Linux)
zwtian
282次阅读
2025-04-08 09:12:48
风口浪尖!诚通证券扩容采购Oracle 793万...
Roger的数据库专栏
266次阅读
2025-03-24 09:42:53
切换Oracle归档路径后,不能正常删除原归档路径上的归档文件
dbaking
265次阅读
2025-03-19 14:41:51