暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 我们面临临时表返回数据的问题

askTom 2017-12-14
683

问题描述

嗨,汤姆,下面是我们的问题
程序成功执行后,应删除临时表中的数据,但我们仍从临时表中获取旧数据。

查询-
----------
声明
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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论