`
juji1010
  • 浏览: 117096 次
社区版块
存档分类
最新评论

ORA-00600报错--引用

 
阅读更多
ORA-00600: internal error code, arguments: [kcbz_check_objd_typ_1], [0], [0], [1], [], [], [], []
Current SQL statement for this session:

select * from tmp_hotelinfolisttest a where salesprice > 0 order by   decode(a.hotel_comm_type,4,6,nvl(a.hotel_comm_type,5)),a.hotel
star,a.lowestprice ,a.hotelid,a.ROOM_TYPE_ID,a.CHILDROOMTYPEID,a.PAY_METHOD,a.able_sale_date,a.salesprice

存储过程简单调试了下没什么问题:从一些表里取到数据,先暂时放在tmp_hotelinfolisttest这个临时表里,最后用一个游标类型的返回参数返回给java,上面报错的sql就是游标所使用的sql.

代码截取如下:

.....

v_sqlstr := 'select * from tmp_hotelinfolisttest a where salesprice > 0 order by '|| v_tempstr;  
open return_list for v_sqlstr;
    --------
commit;

.........


把开发人员提供的输入参数传入,直接在sqlplus下调用,没错误,但用java调用就报错。


google metalink上search了一把,没发现和这个情景一模一样的案例。

据开发人员描述,这个存储过程和另一个包B里的同一存储过程相似,但B不存在这个问题。

仔细比对2个存储过程,没发现有特别之出,除了2个存储过程分别采用了2个不同的临时表.

比较2个临时表的区别,发现A包里用的临时表是on commit delete rows.而B包里的是on on commit preserve rows.

问题就在这里:

如果采用事务级的临时表,那么java在调用完存储过程以后(存储过程最后有commit),临时表里的数据会被delete掉,但是它拿到的那个游标返回参数却需要这些数据,这样就产生了冲突。

而如果采用会话级的临时表,由于java在调用完存储过程后,会话并未结束,数据会一直保存到会话结束为止,因此就不会有问题。

把临时表改成on commit preserve rows 问题解决。

还有3个疑问:

1 当返回一个游标类型的参数时,oracle返回的到底是一个指向sql的指针,还是一个指向数据的指针?


2 为什么在数据库直接调用该存储过程就不会报错?

是不是只有在真正要取游标里的数据时,oracle才会做校验?

还是在 open return_list for v_sqlstr做了校验 然后数据被delete,最后拿数据的时候再次校验的时候报错。


3 从报错误的字面上理解,kcbz_check_objd_typ_1应该是在做check object type

这个check究竟是在check哪个object type是游标的,还是临时表的,还是数据?

分享到:
评论

相关推荐

    关于创建oracle 连接时报以下错误,ORA-01017 ORA-02063

    需要注意的是,在Oracle 11g的文档中找到了对于这一参数的引用,表明它是在Oracle 11g版本中引入的新特性。 总结上述解决方法,面对从Oracle 10g到Oracle 11g的数据库链接认证问题,解决方案集中在密码认证的细节上...

    oracle报错的详细列表

    ### Oracle报错详细列表解析 #### ORA-00001: 违反唯一约束条件 当尝试向具有唯一约束的列插入重复值时触发。例如,在唯一索引或主键约束上。 #### ORA-00017: 请求会话以设置跟踪事件 该错误通常出现在调试过程中...

    ORACLE错误码及解决方法

    错误码ORA-00904表示尝试引用一个不存在的列,这通常是由于列名输入错误导致的。应检查列名的正确性,包括大小写和拼写。 错误码ORA-01408提示已有相同顺序的列集合被索引,这意味着试图创建的索引与现有索引结构...

    Oracle报错信息速查

    八、会话引用进程私用内存(ORA-00023) ORA-00023 错误表示会话引用进程私用内存。当用户尝试引用进程私用内存时,Oracle 数据库将检查是否符合条件,如果不符合,则返回 ORA-00023 错误。 九、超出最大递归 SQL ...

    解决报错ora-32035的方法分析

    ora-32035的具体错误信息是:“未引用在with子句中定义的查询名。至少一个with查询的name未被引用。”这意味着至少有一个在`WITH`子句中创建的临时表没有在随后的查询中使用。 CTE是一种非常有用的构造,它允许你在...

    oracle 数据库错误一览表

    表明试图引用一个不存在的列名。检查SQL语句中的列名拼写,确保它们与表中的实际列名一致。 七、ORA-01652:无法扩展临时表空间 当执行操作需要大量临时空间,而当前分配的临时表空间不足时,会出现此错误。解决...

    ORACLE运行报错.doc

    * ORA-00023: 会话引用进程私用内存;无法分离会话: 这个错误通常发生在尝试分离会话时。 * ORA-00024: 单一进程模式下不允许从多个进程注册: 这个错误通常发生在尝试注册多个进程时。 * ORA-00025: 无法分配 ORA-...

    Orcle的package中访问其它Schema的表报错ORA-00942解决方法

    总结起来,解决Oracle的`Package`访问其他`Schema`的表报错`ORA-00942`的方法主要包括验证对象存在性、进行适当授权、创建同义词(公共或私有)以及重新编译`Package`。确保遵循这些步骤,并始终在操作数据库时谨慎...

    oracle常见报错

    #### ORA-00023: 会话引用进程私用内存;无法分离会话 如果一个会话试图脱离与其相关的私有内存空间(例如,当尝试在共享服务器环境中将会话转换为专用服务器模式时),则会引发此错误。确保会话的配置允许此类转换...

    Oracle利用errorstack追踪tomcat报错ORA-00903 无效表名的问题

    当Tomcat在运行过程中遇到问题,如在执行SQL语句时抛出“ORA-00903: 无效表名”的错误,这通常意味着在应用程序中引用了一个不存在的表。解决此类问题需要有效的调试工具和方法。本文将详细介绍如何利用Oracle的...

    oracle错误合集

    ORA-00023错误表示会话引用了进程私有内存,导致会话无法分离。这可能是在尝试关闭会话时,数据库检测到会话与特定进程的内存分配有关联。 对于ORA-00024错误,它表明在单一进程模式下,不允许从多个进程注册。这...

    Oracle删除数据报ORA 02292错误的巧妙解决方法

    此错误意味着你试图删除的行被其他表中的记录引用,导致数据的一致性受到影响。Oracle设计这种机制是为了保护数据库的完整性,防止意外的数据丢失或破坏。 ORA-02292错误的具体信息通常会包含违反的约束名称,这有...

    ORACLE 面试问题-技术篇

    - **外键**:确保引用完整性。 #### 七、表结构修改 **12. 在不影响子表的情况下重建母表** - 关闭子表的外键约束。 - 重建母表。 - 重新激活子表的外键约束。 #### 八、归档模式与非归档模式 **13. 归档模式与...

    DBA 面试题目

    - 外键约束(`Foreign Key`):确保引用的完整性,使得表之间能建立起参照关系。 #### 12. 如何在不影响子表的前提下,重建一个母表? - 首先使子表的外键约束失效,然后重建母表,最后重新激活外键约束。 #### 13....

    sql面试题\oracle面试题目

    查看数据库引擎的报错 - 使用`SELECT * FROM v$diag_info`查看诊断信息的位置。 - 使用`SELECT * FROM v$database`和`v$instance`查看实例级的错误信息。 - 使用`DBMS_OUTPUT.PUT_LINE(DBMS_UTILITY.FORMAT_ERROR_...

    Oracle DATABASE LINK(DBLINK)创建与删除方法

    引用DBLINK,可以在SQL语句中直接使用,如: ```sql SELECT * FROM worker@zrhs_link; ``` 为方便使用,可以创建同义词或远程视图: ```sql CREATE SYNONYM worker_syn FOR worker@zrhs_link; CREATE VIEW worker AS...

Global site tag (gtag.js) - Google Analytics