FOR I IN ( Variable )

runner_ralf

Neuer Benutzer
Beiträge
4
Hallo alle zusammen,

ich bin ziemlich neu hier und habe eine Frage zu einer For Schleife.
Ich habe ein Select Statement dass ich an eine For Schleife übergeben will.
Ich erhalte immer die Meldung dass ein Select fehlen würde.
Die Variable wird einfach nicht akzeptiert.
Beispiel:

For i in (Select Name from Personen) funktioniert.

Aber ein
TestVariable := 'Select Name from Personen';
For i in ( TestVariable ) funktioniert nicht!?
Auch nicht For i in ( '|| TestVariable ||').

Weiß einer von euch wie da umzusetzen ist?
Natürlich ist das Statement viel umfangreicher. ist nur ein Beispiel...

Danke für eure Hilfe.

Gruß

Ralf
 
Werbung:
Hi,

solange du, wie in deinem Beispiel gezeigt, nur mit einspaltigen Resultsets arbeitest kannst du das so machen:
Code:
Declare
   l_curs   Sys_Refcursor;
   l_query  Varchar2(4000);

   l_rec Varchar2(4000);
Begin
   l_query := 'Select ''Hi'' From dual';

   Open l_curs For l_query;

   Loop
      Fetch l_curs
         Into l_rec;
  
      Exit When l_curs%NotFound;
      dbms_output.put_line(l_rec);
   End Loop;
End;
Ist zwar "etwas" bis "sehr" umständlich... Aber funktioniert...
(Auch wenn mir bis jetzt immernoch ziemlich unklar ist, wofür man das braucht... Würde mich mal interessieren :) )
 
Hallo Distrilec,

es handelt sich um einen interaktiven Report der eine ganze Menge Spalten hat. Die User wählen einen Filter aus und ich brauche jetzt von den gewählten DS nur die ID weil ich mit dieser eine andere tabelle manupulieren muss.

Dieses Statement kann ich mir holen über ein Packages.

SELECT region_id
INTO v_region_id
FROM apex_application_page_regions
WHERE application_id = p_app_id
AND page_id = p_page_id
AND source_type = 'Interactive Report';

v_report_id :=
apex_ir.get_last_viewed_report_id (p_page_id => p_page_id,
p_region_id => v_region_id
);
v_report :=
apex_ir.get_report (p_page_id => p_page_id,
p_region_id => v_region_id,
p_report_id => v_report_id
);
v_query := v_report.sql_query;

FOR i IN 1 .. v_report.binds.COUNT
LOOP
v_query :=
REPLACE (v_query,
':' || v_report.binds (i).NAME,
'''' || v_report.binds (i).VALUE || ''''
);
END LOOP;

IF p_all_cols
THEN
FOR c IN (SELECT *
FROM apex_application_page_ir_col
WHERE application_id = p_app_id AND page_id = p_page_id
ORDER BY display_order)
LOOP
v_column := v_column || ', ' || c.column_alias;
END LOOP;

v_column := LTRIM (v_column, ', ');
v_position := INSTR (v_query, '(');
v_query := SUBSTR (v_query, v_position);
v_query := 'SELECT ' || v_column || ' FROM ' || v_query;
END IF;

so und jetzt möchte ich eben aus dem v_query nur die ID rausholen...

Gruß

Ralf
 
Von welcher ID sprechen wir hier? Ich gehe mal davon aus es handelt sich dabei immer um eine Spalte in deiner "Spaltenliste" (v_column) ?
Ist denn der Spaltenalias deiner ID immer gleich?
Oder steht die ID immer an einer bestimmten Stelle in deiner "Spaltenliste"?

Irgendwie müssen wir deine ID identifizieren können, um Sie gesondert auslesen zu können :)
 
Ja, richtig, es ist die ID der Tabelle. Das Feld heißt ID. Und nur diese ID Nummer brauche ich von allen DS im ausgewählten Filter.

Hast du vielleicht eine Lösung?

Ich habe zwar schon das Statement ausgelsen und mit intsr und substr die where Clausel herausgefiltert und dann einen 'select ID from Tabelle where ' || where_statement gebastelt und das funktioniert auch aber nur bei einem Report der keinen gewählten Filter hat. Das Dubiose ist dass wenn ein Filter ausgewählt ist, in der Where Klausel einmal ein rwhere zusammengeschrieben steht und dann meine Abfrage natürlich aus Fehler läuft. Im normalen Statement steht als Beispiel select ID, Name from Person r where (....bla). Mit einem gewählten Filter steht dann select ID, Name from Person rwhere (...bla).

Vielleicht kann ich ja anders auf das Statement zugreifen als mit dem gebastel des Where teils??

Habe das ganze WE gesucht. Leider umsonsost. Die ursprüngliche Frage mit der For i in ( Valiable ) ist damit auch sinnlos geworden. Denn das Statement hat eben den schei... rwhere den ich auch mit replace nicht ersetzen kann.
Warum? ich weiß es nicht.

Es wäre einfach toll wenn ich nur irgendwie die ID vom gewählten Filter aus dem interaktiven Report bekommen würde.....

Gruß Ralf
 
Werbung:
Würde
Code:
v_position := INSTR (v_query, '(');
v_query := SUBSTR (v_query, v_position);
v_query := 'SELECT ID FROM ' || v_query;
Dein Problem dann nicht lösen? (Davon ausgehend das die Spalte auch wirklich immer ID ist...)
 
Zurück
Oben