# Oracle Cursor anhand einer if Bedingung erstellen



## Eichhoernchen09 (3. November 2005)

Hallo,

 mein Problem ist das folgende:

ich habe eine Prozedur, an deren Anfang (also nach CREATE PROCEDURE, aber vor BEGIN) ich einen Cursor erstelle.

Nun möchte ich aber anhand einer boolschen Varibale, die der Prozedur aus einem C# Programm übergeben wird, die SELECT Anfrage für den Cursor anpassen.

Ungefähr so:
if var = true then cursor mycursor is select ...
else cursor mycursor is select ...
end if

Vielleicht kann man das auch erst nach dem BEGIN machen, aber das habe ich auch noch nicht hinbekommen.

Es geht eigentlich darum, dass man in meinem Programm Kunden auswählen kann oder die Anfrage für alle Kunden ausführt. Die select Anfrage für den Cursor muss dann eben entweder für alle Kunden oder nur für die ausgewählten, die sich in einer temporären Tabelle befinden, laufen. Ob alle oder nur bestimmte gewählt sind, wollte ich über die boolsche Variable bestimmen.

Ich bin auch für alternative Lösungen offen.

Vielen Dank im Voraus!


----------



## Exceptionfault (4. November 2005)

Das ist eigentlich ganz einfach. Du musst nur einen eigenen Typ REF CURSOR deklarieren und diesen dann in deiner IF Bedingung öffnen. Beispiel:

```
CREATE OR REPLACE PROCEDURE myPROC( v_VALUE IN NUMBER, v_CUR OUT SYS_REFCURSOR )
IS
   -- brauchen wir hier nicht deklarieren, weil es bereits ein Parameter der Prozedur ist
   -- v_cur SYS_REFCURSOR;
BEGIN
   IF v_VALUE = 1 THEN
     OPEN v_cur FOR
        SELECT * FROM TABLE1;
   ELSE
     OPEN v_cur FOR
        SELECT * FROM TABLE2;
   END IF;
END;
```

Das Beispiel geht allerdings erst ab Oracle 9. 8i kennt den Type SYS_REFCURSOR nicht. Da gibts aber einen einfachen Workaraound.


----------



## Eichhoernchen09 (6. November 2005)

Danke erstmal für Deine Antwort!

Prinzipiell funktioniert das. Ich kann das in meinen Prozedurkopf einbauen und auch die IF ELSE Bedingung ausführen.
Danach möchte ich aber in der Prozedur über den Cursor einen LOOP laufen lassen, der den Cursor Inhalt auswertet.
Dazu schreibe ich ein Stück später: 


```
OPEN v_cur;

LOOP

      FETCH v_cur INTO mycur;

      EXIT WHEN ...
      
      ...

END LOOP;
```

Bei OPEN zeigt mir der Compiler nun eine Fehlermeldung an:
"Dieser Ausdruck hat den falschen Typ."

Außerdem kann ich vorher auch nicht

```
mycur v_cur%ROWTYPE;
```
festlegen. Es wird folgende Meldung angezeigt:
"Die Typ-Deklaration dieses Ausdruckes ist unvollständig oder fehlerhaft."
An welcher Stelle müsste ich das machen?
Eigentlich geht das ja nicht vor dem IF ELSE, da die Cursor Zeilen dann noch nicht bekannt sind, oder?
mycur benötige ich, um in der Schleife auf die Cursor-Inhalte zuzugreifen.

Hast Du dazu noch ein paar Hinweise?


----------

