2016-08-04 25 views
0

Schreiben eines Skripts zum Testen eines (zu schreibenden) Triggers, aber ich erhalte eine seltsame Fehlermeldung, wenn ich die Änderung rückgängig mache. Hier ist das TestskriptSeltsamer Fehler beim Einfügen von Zeilen, gefolgt von einem Rollback in oracle11g

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; 

Nach dem Scrollen etwa auf halbem Weg durch die von der SELECT-Anweisung zurückgegebenen Zeilen die Tabelle verdunstet und ich erhalte eine Fehlermeldung getroffen:

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. 

Wenn ich das Skript ohne den Rollback und dann den Rollback separat auszugeben ist alles in Ordnung. Aber das wird später zu einer nervigen Testeinheit.

Antwort

1

Das Problem herausgefunden! Stellt Oracle-SQL-Entwickler standardmäßig nur 50 Zeilen zu einem Zeitpunkt standardmäßig aus. Nachdem ich mit dem Scrollen begonnen habe, wird es abgehen und die nächsten 50 Zeilen holen, was zu möglicherweise ungültigen Ergebnissen führt, da die Auswahl vor dem Rollback ausgegeben wurde und ich einen Fehler erhalte. Behoben, indem ich in preference-> Datenbank ging und die Rückgabegröße änderte, die glücklicherweise für mich nur innerhalb des erlaubten Höchstbetrags lag (200 Ergebnisse).

+0

Sie führen also die Einfügung als Anweisung aus, führen die Abfrage als Anweisung aus, wechseln von der Rasteransicht zum Arbeitsblatt, führen das Rollback als Anweisung aus und kehren dann zur Rasteransicht zurück und scrollen nach unten? Wenn Sie ein Skript schreiben, führen Sie es nicht als Skript, sondern als einzelne Anweisungen aus. –

+0

Ich habe die Einfüge-, Abfrage- und Rollback-Anweisung, die ich auf einmal aus einem Arbeitsblatt ausführen. Ich muss nicht wechseln. Sql-Entwickler gibt die Abfrageergebnisse in einem Fenster zurück. Ich dachte, ein Bündel von Anweisungen in einem Arbeitsblatt zu schreiben, war ein Skript. –

+1

OK, dann markieren/markieren Sie die drei Anweisungen und machen 'Anweisung ausführen' (control-enter) von allen zusammen. Der Effekt ist derselbe - Sie können sogar sehen, dass er das Fenster Abfrageergebnisse kurz anzeigt. Wenn Sie "Skript ausführen" (F5) ausführen, wird die Ausgabe in das Fenster "Skriptausgabe" anstelle des Fensters "Abfrageergebnis" verschoben (es gilt ein anderes Limit, standardmäßig 5000, unter Extras-> Einstellungen-> Datenbank-> Arbeitsblatt) Der Rollback wird erst ausgegeben, wenn alle Abrufe abgeschlossen sind, so dass Sie diesen Fehler nicht erhalten. Sie können die Rasterausgabe jedoch besonders wünschen. –