Öffnet einen zuvor deklarierten Cursor, um auf Informationen aus der Datenbank zuzugreifen.
OPEN cursor-name [ USING { DESCRIPTOR sqlda-name | hostvar, ... } ] [ WITH HOLD ] [ ISOLATION LEVEL isolation-level ] [ BLOCK n ]
OPEN cursor-name [ WITH HOLD ] [ ISOLATION LEVEL isolation-level ]
cursor-name : identifier | hostvar
sqlda-name : identifier
isolation-level : 0 | 1 | 2 | 3 | SNAPSHOT | STATEMENT SNAPSHOT | READONLY STATEMENT SNAPSHOT
USING DESCRIPTOR-Klausel Die Klausel USING DESCRIPTOR gilt nur für Embedded SQL. Sie gibt die Hostvariablen an, die an die Platzhalter-Indikatorvariablen in der SELECT-Anweisung gebunden sind, für die der Cursor deklariert wurde.
OPEN...USING kann nicht in einer gespeicherten Prozedur benutzt werden.
WITH HOLD-Klausel Standardmäßig werden alle Cursor automatisch bei Abschluss der aktuellen Transaktion (COMMIT oder ROLLBACK) geschlossen. Wenn die optionale WITH HOLD-Klausel angegeben wurde, dann wird der Cursor für nachfolgende Transaktionen offen gehalten. Der Cursor bleibt bis zum Ende der aktuellen Verbindung oder bis zu einer expliziten CLOSE-Anweisung geöffnet. Cursor werden automatisch geschlossen, wenn die Verbindung zur Datenbank beendet wird.
Bei COMMIT oder ROLLBACK werden alle von der Verbindung gehaltenen langfristigen Zeilensperren freigegeben, einschließlich der Zeilen, die die Ergebnismenge eines WITH HOLD-Cursors darstellen. Dageben bleiben Cursor-Stabilitätssperren, die auf den Isolationsstufen 1, 2, und 3 gesetzt wurden, über die gesamte Lebensdauer des Cursors erhalten und werden erst freigegeben, wenn der Cursor geschlossen oder die Verbindung beendet wird.
Nach Abschluss einer ROLLBACK-Anweisung sind Inhalt und dessen Positionierung innerhalb eines WITH HOLD-Cursor nicht vorhersehbar und können nicht garantiert werden. Mithilfe der Option ansi_close_cursors_on_rollback können sie steuern, ob ein WITH HOLD-Cursor durch eine ROLLBACK-Anweisung automatisch geschlossen wird.
ISOLATION LEVEL-Klausel Mit der ISOLATION LEVEL-Klausel kann dieser Cursor auf einer anderen Isolationsstufe geöffnet werden als der, die durch die Option isolation_level zurzeit festgelegt ist. Alle Vorgänge dieses Cursors werden ungeachtet der Optionseinstellung auf der angegebenen Isolationsstufe ausgeführt. Wenn diese Klausel nicht angegeben ist, dann entspricht die Isolationsstufe des Cursors während der gesamten Zeit, die der Cursor geöffnet ist, dem Wert der Option isolation_level, der eingestellt war, als der Cursor geöffnet wurde.
Folgende Werte werden unterstützt:
Der Cursor wird vor der ersten Zeile positioniert.
BLOCK-Klausel Diese Klausel kann nur in Embedded SQL verwendet werden. Eine Clientanwendung kann mehr als eine Zeile gleichzeitig abrufen. Dies wird Blockabruf, Prefetch-Vorgang oder Mehrzeilenabruf genannt. Die BLOCK-Klausel kann die Anzahl von Prefetch-Zeilen verringern. Die Angabe der BLOCK-Klausel in OPEN ist dasselbe wie ein Angeben der BLOCK-Klausel in jedem FETCH.
Die OPEN-Anweisung öffnet den Cursor mit dem angegebenen Namen. Der Cursor muss zuvor deklariert worden sein.
Die OPEN-Anweisung kann eine SQL-Warnung zurückgeben, wenn der Cursortyp nicht zu den Eigenschaften der dem Cursor zugrunde liegenden Anweisung passt.
Ist der Cursor für eine CALL-Anweisung geöffnet, dann führt OPEN dazu, dass die Prozedur solange abgearbeitet wird, bis die erste Ergebnismenge angetroffen wird (bei einer SELECT-Anweisung ohne INTO-Klausel). Wenn die Prozedur abgearbeitet ist und keine Ergebnismenge ermittelt wurde, wird die Warnung SQLSTATE_PROCEDURE_COMPLETE gesetzt.
Embedded SQL-Verwendung Nach der erfolgreichen Ausführung der OPEN-Anweisung wird das Feld sqlerrd[3] des SQLCA (SQLIOESTIMATE) mit einer geschätzten Anzahl der Eingabe/Ausgabevorgänge gefüllt, die notwendig sind, um alle Zeilen der Abfrage abzurufen. Außerdem wird in das Feld sqlerrd[2] des SQLCA (SQLCOUNT) die tatsächliche Anzahl der Zeilen im Cursor (ein Wert größer oder gleich 0) oder eine Schätzung hiervon (eine negative Zahl, deren absoluter Wert eine Schätzung ist) eingetragen. Es wird sich um die tatsächliche Anzahl der Zeilen handeln, wenn der Datenbankserver sie errechnen kann, ohne die Zeilen zu zählen. Die Datenbank kann ebenfalls so konfiguriert werden, dass sie immer die tatsächliche Anzahl der Zeilen liefert, was jedoch sehr kostenträchtig sein kann.
Wenn der cursor-name von einem Bezeichner oder einer Zeichenfolge angegeben wird, muss die entsprechende DECLARE CURSOR-Anweisung im C-Programm vor der OPEN-Anweisung stehen. Wenn der cursor-name von einer Hostvariablen angegeben wird, muss die DECLARE CURSOR-Anweisung vor der OPEN-Anweisung ausgeführt werden.
Wenn der Cursor für eine SELECT-Anweisung gilt, müssen Sie entweder Eigentümer des im Cursor referenzierten Objekts sein, das SELECT-Privileg für das Objekt haben oder das entsprechende SELECT-Systemprivileg haben (z.B. SELECT ANY TABLE).
Wenn der Cursor für eine CALL-Anweisung gilt, müssen Sie Eigentümer der Prozedur sein, das EXECUTE-Privileg für die Prozedur haben oder das EXECUTE ANY PROCEDURE-Systemprivileg haben.
OPEN führt zu einer vollständigen Materialisierung der Ergebnismenge eines INSENSITIVE-Cursors.
Wenn das Caching des Zugriffsplans aktiviert ist, werden einige SQL-Warnungen, die an die Anwendung während der OPEN-Zeit normalerweise zurückgegeben werden, unterdrückt. Die unterdrückten Warnmeldungen sind Warnungen, die anzeigen, dass der Cursortyp geändert wurde, dass die zugrunde liegende Abfrage nicht deterministisch ist oder dass eine Kürzung der Zeichenfolge aufgetreten ist, wobei eine oder mehrere Literalkonstanten in der Anweisung eingebettet sind.
SQL/2008 Die Verwendung der OPEN-Anweisung in Embedded SQL ist Teil der optionalen SQL-Sprachenfunktion B031 (Basic Dynamic SQL). Die Verwendung der OPEN-Anweisung in einer gespeicherten Prozedur ist eine Kernfunktion von SQL/2008. Die Klauseln ISOLATION LEVEL und BLOCK sind Erweiterungen des Herstellers, ebenso die Möglichkeit, einen Cursor über eine CALL-Anweisung zu öffnen. Im SQL/2008-Standard wird WITH HOLD als Teil der DECLARE CURSOR-Anweisung angegeben und nicht bei OPEN.
Das Setzen bestimmter Werte im SQLCA ist eine Erweiterung des Herstellers.
Transact-SQL Die OPEN-Anweisung wird von Adaptive Server Enterprise unterstützt. Adaptive Server Enterprise unterstützt nicht die Klauseln ISOLATION LEVEL, BLOCK und WITH HOLD.
Die folgenden Beispiele zeigen, wie OPEN in Embedded SQL verwendet wird.
EXEC SQL OPEN employee_cursor; |
EXEC SQL PREPARE emp_stat FROM 'SELECT empnum, empname FROM GROUPO.Employees WHERE name like ?'; EXEC SQL DECLARE employee_cursor CURSOR FOR emp_stat; EXEC SQL OPEN employee_cursor USING :pattern; |
Dieses Beispielfragment zeigt eine OPEN-Anweisung in einer Prozedur oder einem Trigger.
BEGIN DECLARE cur_employee CURSOR FOR SELECT Surname FROM GROUPO.Employees; DECLARE name CHAR(40); OPEN cur_employee; LP: LOOP FETCH NEXT cur_employee INTO name; IF SQLCODE <> 0 THEN LEAVE LP END IF; ... END LOOP CLOSE cur_employee; END |
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2013, SAP AG oder ein SAP-Konzernunternehmen. - SAP Sybase SQL Anywhere 16.0 |