【问题标题】:Strange error inserting rows followed by a rollback in oracle11g在 oracle11g 中插入行后跟回滚的奇怪错误
【发布时间】:2016-08-04 04:10:17
【问题描述】:

正在编写脚本来测试(待编写)触发器,但如果我回滚更改,则会收到一条奇怪的错误消息。 这是测试脚本

    insert into prescription values(
  143, 115, 
  to_date('January 15, 1989, 11:00 A.M.',
  'Month dd, YYYY, HH:MI A.M.',
  'NLS_DATE_LANGUAGE = American'),
  5, 12, 'hours', 12);
select * from prescription;
rollback;

在选择语句返回的行滚动大约一半后,表格消失了,我收到一条错误消息:

ORA-01002: fetch out of sequence
01002. 00000 -  "fetch out of sequence"
*Cause:    This error means that a fetch has been attempted from a cursor
           which is no longer valid.  Note that a PL/SQL cursor loop
           implicitly does fetches, and thus may also cause this error.
           There are a number of possible causes for this error, including:
           1) Fetching from a cursor after the last row has been retrieved
           and the ORA-1403 error returned.
           2) If the cursor has been opened with the FOR UPDATE clause,
           fetching after a COMMIT has been issued will return the error.
           3) Rebinding any placeholders in the SQL statement, then issuing
           a fetch before reexecuting the statement.
*Action:   1) Do not issue a fetch statement after the last row has been
           retrieved - there are no more rows to fetch.
           2) Do not issue a COMMIT inside a fetch loop for a cursor
           that has been opened FOR UPDATE.
           3) Reexecute the statement after rebinding, then attempt to
           fetch again.

如果我在没有回滚的情况下运行脚本,然后单独发出回滚,一切都很好。但这会在以后产生烦人的测试单元。

【问题讨论】:

    标签: sql oracle plsql oracle11g rollback


    【解决方案1】:

    发现问题了! 结果 oracle SQL developer 默认一次只返回 50 行。因此,在我开始向下滚动后,它会关闭并获取接下来的 50 行,这会导致可能出现无效结果,因为在回滚之前发出了选择,并且出现错误。通过进入首选项-> 数据库并更改返回大小来修复,幸运的是我刚好在他们允许的最大数量(200 个结果)之内。

    【讨论】:

    • 因此您将插入作为语句运行,将查询作为语句运行,从网格视图切换回工作表,将回滚作为语句运行,然后返回到网格查看并向下滚动?如果您正在编写脚本,为什么不将其作为脚本而不是单独的语句来运行?
    • 我有从工作表一次性运行的插入、查询和回滚语句。我不需要做任何切换。 Sql developer 在窗口中返回查询结果。我认为在工作表中写一堆语句是一个脚本。
    • 好的,然后您选择/突出显示这三个语句并一起执行所有这些语句的“运行语句”(控制输入)。效果是一样的——你甚至可以看到它短暂地显示了查询结果窗口。如果您“运行脚本”(F5),则输出将进入脚本输出窗口而不是查询结果窗口(此处适用不同的限制,默认为 5000;在工具->首选项->数据库->工作表中设置)。在完成所有提取之前不会发出回滚,因此您不会收到该错误。不过,您可能特别想要网格输出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多