Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

DECLARE CURSOR - Cursor vereinbaren

DECLARE CURSOR vereinbart einen Cursor. Mit dem Cursor kann auf die einzelnen Sätze einer Ergebnistabelle zugegriffen werden. Der aktuelle Satz, auf den der Cursor zeigt, kann gelesen werden. Bei einem änderbaren Cursor können die Sätze auch geändert und gelöscht werden.

Die Cursorvereinbarung muss im Programmtext vor allen Anweisungen stehen, in denen der Cursor verwendet wird. Alle Anweisungen, die diesen Cursor verwenden, müssen in derselben Übersetzungseinheit stehen. Dies gilt nicht für lokale Cursor (in Prozeduren).

DECLARE CURSOR ist keine ausführbare Anweisung.



DECLARE cursor [SCROLL | NO SCROLL ] CURSOR

              [WITH HOLD | WITHOUT HOLD]

              FOR { cursorbeschreibung | anweisungsbezeichner }


cursorbeschreibung ::=

            abfrageausdruck

      [ORDER BY   sort_ausdruck [ASC | DESC]

              [,   sort_ausdruck  [ASC | DESC]]...]

      [FETCH FIRST max ROWS ONLY]

      [FOR { READ ONLY | UPDATE [OF spalte ,...] }]


sort_ausdruck  ::= { spalte | { spalte ( posnr ) | spalte[posnr] } | spaltennummer | ausdruck }

posnr ::= vorzeichenlose_ganzzahl

spaltennummer ::= vorzeichenlose_ganzzahl

max ::= vorzeichenlose_ganzzahl



cursor

Name für den Cursor. Innerhalb einer Übersetzungseinheit dürfen nicht mehrere Cursor mit demselben Namen vereinbart werden. Der Gültigkeitsbereich des Cursors ist auf die Übersetzungseinheit beschränkt, in der der Cursor vereinbart wurde. Dies gilt nicht für lokale Cursor (in Prozeduren).


SCROLL

Der Cursor kann mit FETCH NEXT/PRIOR/FIRST/LAST/RELATIVE/ABSOLUTE in beliebiger Reihenfolge auf jeden Satz der Ergebnistabelle positioniert werden.

SCROLL dürfen Sie nur angeben, wenn für die Cursorbeschreibung von cursor keine FOR UPDATE-Klausel vereinbart wird.

Wenn Sie SCROLL angeben, ist der Cursor cursor nicht änderbar. Es gilt implizit die FOR READ ONLY-Klausel.


NO SCROLL

Die Ergebnistabelle kann nur sequenziell gelesen werden. Der Cursor kann nur auf den jeweils nächsten Satz positioniert werden. Bei FETCH ist nur die Positionsangabe NEXT erlaubt.


WITH HOLD

Ein Cursor kann mit WITH HOLD spezifiziert werden. Ist ein solcher Cursor am Ende der Transaktion im geöffneten Zustand, so bleibt er es auch nach einem COMMIT WORK. WITH HOLD kann bei lokalen Cursorn (in Prozeduren) nicht angegeben werden, siehe Abschnitt „Cursor".

Ein Cursor WITH HOLD wird dennoch geschlossen, falls der Cursor in einer Transaktion mit OPEN geöffnet oder mit FETCH positioniert wurde und diese Transaktion mit ROLLBACK beendet wird. Auch beim Ende der SQL-Sitzung wird der Cursor in jedem Fall geschlossen.


WITHOUT HOLD

Ein noch offener Cursor wird bei Transaktionsende geschlossen.


cursorbeschreibung

Statischen Cursor vereinbaren.

cursorbeschreibung definiert die Ergebnistabelle und die Eigenschaften des Cursors. Ein Satz der Ergebnistabelle wird frühestens dann bestimmt, wenn der Cursor mit OPEN geöffnet wird. Er wird spätestens beim Ausführen einer FETCH-Anweisung bestimmt.


anweisungsbezeichner

Dynamischen Cursor vereinbaren.

anweisungsbezeichner ist der Name einer dynamisch formulierten Cursorbeschreibung. Eine dynamisch formulierte Cursorbeschreibung kann zur Laufzeit des Programms angegeben werden. Es sind dieselben Klauseln erlaubt wie bei einer statischen Cursorbeschreibung. Eine dynamisch formulierte Cursorbeschreibung muss mit einer PRE-PARE-Anweisung vorbereitet werden, in der der Name anweisungsbezeichner verwendet wird.


abfrageausdruck

Abfrage-Ausdruck zur Auswahl von Sätzen und Spalten aus Basistabellen oder Views.

In abfrageausdruck wird der Wert für Benutzervariablen, Prozedurparameter und Prozedurvariablen erst beim Öffnen des Cursors ermittelt. Spezial-Literale sowie Zeitfunktionen, die in abfrageausdruck vorkommen, werden erst beim Öffnen des Cursors ausgewertet.


ORDER BY

Die ORDER BY-Klausel bezeichnet die Spalten, nach denen die Ergebnistabelle sortiert werden soll. Es wird zuerst nach den Werten der ersten angegebenen Spalte sortiert. Wenn Sätze in der ersten Spalte vorkommen, die nach den Vergleichsregeln gleiche Werte haben (siehe Abschnitt „Vergleich von zwei Zeilen"ff), werden diese gemäß der zweiten Sortierspalte sortiert usw. In SESAM/SQL sind NULL-Werte beim Sortieren kleiner als alle Nicht-NULL-Werte.

Die Reihenfolge der Sätze mit gleichen Werten in allen Sortierspalten ist undefiniert.

ORDER BY dürfen Sie nur angeben, wenn für die Cursorbeschreibung von cursor keine FOR UPDATE-Klausel vereinbart wird.

Wenn Sie ORDER BY angeben, ist der Cursor cursor nicht änderbar. Es gilt implizit die FOR READ ONLY-Klausel.

ORDER BY nicht angegeben:Die Reihenfolge der Sätze der Cursortabelle ist undefiniert.


spalte

Name der Spalte in abfrageausdruck, nach der sortiert werden soll. spalte muss ein einfacher Spaltenname ohne Tabellennamen sein. Er muss zu der Ergebnistabelle gehören, die mit abfrageausdruck erzeugt wird.


{spalte(posnr), spalte[posnr]}

Element einer multiplen Spalte, nach dem sortiert werden soll. posnr ist eine vorzeichenlose Ganzzahl, die die Positionsnummer des Spaltenelements in der multiplen Spalte angibt. Ansonsten muss das Spaltenelement zu der Ergebnistabelle gehören, die mit abfrageausdruck erzeugt wird.

In der Syntax kursiv gedruckte eckige Klammern sind Sonderzeichen und müssen in der Anweisung angegeben werden.


spaltennummer

Nummer der Spalte, nach der sortiert werden soll.

spaltennummer ist eine vorzeichenlose Ganzzahl mit:1 <= spaltennummer <= Anzahl der Ergebnisspalten.

Durch die Angabe der Spaltennummer können Sie auch Spalten als Sortierbegriff verwenden, die keinen oder keinen eindeutigen Spaltennamen haben.

spaltennummer kann eine einfache Spalte oder eine multiple Spalte mit Dimension 1 bezeichnen.


ausdruck

Sie können auch nach Ausdrücken sortieren, die nicht in der Resultattabelle vorkommen, wie zum Beispiel UPPER(spalte).

Dabei müssen folgende Bedingungen erfüllt sein:

    • abfrageausdruck muss ein einfacher SELECT-Ausdruck sein.

    • ausdruck darf nicht nur aus einem Literal bestehen.

    • ausdruck darf keine Unterabfrage und keine Mengenfunktion enthalten.

    • In ausdruck dürfen Spalten von Tabellen aus der FROM-Klausel verwendet werden, auch wenn sie nicht in der SELECT-Liste vorkommen.


ASC

Die Werte der zugehörigen Spalte werden aufsteigend sortiert.


DESC

Die Werte der zugehörigen Spalte werden absteigend sortiert.


FETCH FIRST max ROWS ONLY

Begrenzt die von einem Cursor gelieferte Treffermenge auf max (vorzeichenlose Ganzzahl > 0) Treffersätze. Wenn die Cursorposition größer als max ist, dann wird ein SQL-STATE (keine Daten, Klasse 02xxx) geliefert. Ein Cursor mit dieser Klausel ist nicht-änderbar..


FOR READ ONLY

Die FOR READ ONLY-Klausel legt fest, dass der Cursor cursor nur zum Lesen der Sätze der Ergebnistabelle verwendet werden kann (Nicht-änderbarer Cursor oder Cursor zum Lesen).

Ist der zu Grunde liegende Abfrageausdruck nicht änderbar, so gilt die FOR READ ONLY-Klausel implizit (siehe Abschnitt „Änderbarkeit von Abfrage-Ausdrücken"). Sie gilt auch dann, wenn in der Cursorvereinbarung SCROLL, ORDER BY oder FETCH FIRST max ROWS ONLY angegeben wurden.


FOR UPDATE

Die FOR UPDATE-Klausel darf nur angegeben werden, wenn der zu Grunde liegende Abfrageausdruck änderbar ist (siehe Abschnitt „Änderbarkeit von Abfrage-Ausdrücken" ) und weder SCROLL noch ORDER BY noch FETCH FIRST max ROWS ONLY angegeben wurden. Mit der FOR UPDATE-Klausel können Sie festlegen, welche Spalten der zu Grunde liegenden Tabelle über den Cursor mit UPDATE...WHERE CURRENT OF geändert werden dürfen.

Wurde für den betreffenden Cursor ein Pragma PREFETCH vereinbart, so schaltet die FOR UPDATE-Klausel die Wirksamkeit dieses Pragmas aus (siehe Abschnitt „Pragma PREFETCH").

FOR UPDATE nicht angegeben:Ist der Cursor änderbar (siehe Abschnitt „Cursor definieren") und wurde keine FOR READ ONLY-Klausel angegeben, können alle Spalten der zu Grunde liegenden Tabelle mit UPDATE...WHERE CURRENT OF geändert werden.


OF spalte,...

Nur die angegebenen Spalten dürfen mit UPDATE...WHERE CURRENT OF geändert werden.Für spalte geben Sie den Namen einer Spalte der Tabelle an, auf die sich der änderbare Cursor bezieht. spalte ist der einfache Name der Spalte aus der zu Grunde liegenden Tabelle, auch wenn im Abfrage-Ausdruck der Cursorbeschreibung neue Spaltennamen definiert werden.


Beispiel

Es wird ein änderbarer Cursor CUR vereinbart. Die zu Grunde liegende Tabelle ist TAB. Nur die Spalte sp der Tabelle TAB darf über den Cursor CUR geändert werden. Dazu wird in der Cursorbeschreibung eine FOR UPDATE-Klausel mit dem Spaltennamen SP angegeben.

DECLARE cur CURSOR FOR
   SELECT korr.sp AS spalte FROM tab AS korr
   FOR UPDATE OF sp

In der FOR UPDATE-Klausel wird der einfache ursprüngliche Spaltenname SP verwendet, obwohl in der SELECT-Liste der Spaltenname und in der FROM-Klausel die Tabelle umbenannt wurden.

OF spalte,... nicht angegeben:Jede Spalte der zu Grunde liegenden Tabelle kann mit UPDATE...WHERE CURRENT OF geändert werden.


Beispiele


Der Cursor CUR_AUFTRAG wählt ANR, KNR, KONR, ATEXT, FERTIGSOLL und ASTNR aus für Aufträge mit einer Auftragsnummer zwischen 300 und 500. Die Sätze werden nach aufsteigender Auftragsnummer sortiert.

DECLARE cur_auftrag CURSOR FOR
   SELECT anr, knr, konr, atext, fertigsoll, astnr
   FROM   auftrag 
   WHERE  anr BETWEEN 300 AND 500
   ORDER  BY anr ASC


Der Cursor CUR_AUFTRAG1 wählt ANR, ADATUM, ATEXT und ASTNR aus für Aufträge, deren Kundennummer in der Benutzervariablen KUNDENNR angegeben wird.

DECLARE cur_auftrag1 CURSOR FOR
   SELECT anr, adatum, atext, astnr
   FROM   auftrag 
   WHERE  knr= :KUNDENNR


Der Cursor CUR_MWST wählt alle Leistungen aus, für die keine Mehrwertsteuer berechnet wird. Der Cursor ist mit WITH HOLD spezifiziert, so dass er auch nach einem COMMIT WORK im geöffneten Zustand bleibt, wenn er am Ende der Transaktion im geöffneten Zustand war.

              
DECLARE cur_mwst CURSOR WITH HOLD FOR
   SELECT lnr, ltext, mwsatz
   FROM   leistung 
   WHERE  mwsatz=0.00
   FOR UPDATE


Vereinbarung des Schubmodus für einen statischen Cursor.

--%PRAGMA PREFETCH blockungsfaktor
DECLARE cursor CURSOR FOR cursorbeschreibung

Siehe auch

CLOSE, DELETE, FETCH, INSERT, OPEN, PREPARE, SELECT, UPDATE