SQL SELECT FROM Tabellenname als Variable

-=Renegade=-

Lt. Junior Grade
Registriert
Nov. 2006
Beiträge
430
Hey!

Ich möchte auf einer Oracle 10g Datenbank eine Procedure erstellen, welche als Parameter einen Tabellennamen übergeben bekommt.

Nur wenn ich die Procedure erstellen möchte regt er sich auf, das es zB im SELECT * FROM Statement die Tabelle nicht gibt, weil er sie nicht als Variable erkennt.

Gibt es da trotzdem eine Möglichkeit?


Bsp:
CURSOR c_imageid IS
SELECT BILDID
FROM table_name;

Wobei table_name der Parameter ist, welcher der Procedure übergeben wird, führt logischerweise zu: PL/SQL: ORA-00942: Tabelle oder View nicht vorhanden

Vielen Dank im Voraus


so long
 
Zuletzt bearbeitet:
Thats all until now ;)

Code:
CREATE OR REPLACE PROCEDURE extract_files(table_name IN VARCHAR)
IS

    ExecImmediate_STR VARCHAR(2000);
    
    CURSOR c_imageid IS
        SELECT BILDID
        FROM table_name;

BEGIN
    ExecImmediate_STR := 'CREATE OR REPLACE DIRECTORY IMAGES_' || table_name || ' AS "C:\images\' || table_name || '"';
    dbms_output.put_line ('ExecImmediate_STR=' || ExecImmediate_STR);
    execute immediate (ExecImmediate_STR);


END;
 
Vielleicht geht eine CASE. Allerdings bist du dann nicht mehr so flexibel und musst jede Tabelle extra behandeln.
Ergänzung ()

Hab noch was gefunden: DBMS_SQL
 
Dein Stichwort sind REFCURSORs.

Das könntest du z.B. folgendermaßen machen:
Code:
CREATE OR REPLACE PROCEDURE extract_files(table_name IN VARCHAR) 
IS
  TYPE bild_cur_type IS REF CURSOR;
  CURSOR image_cursor bild_cur_type;
  imageid NUMBER(10); -- Hier natürlich den entsprechenden Typ verwenden.
BEGIN
  OPEN image_cursor FOR 'SELECT bildid FROM ' || table_name;
  LOOP
    FETCH image_cursor INTO imageid;
    EXIT WHEN image_cursor%NOTFOUND;
    DBMS_OUTPUT.put_line('Bild gefunden: ' || imageid);
  END LOOP;
  CLOSE image_cursor;
END;
 
genau
was ich dir empfehlen würde wäre eine einheitlich benamung
so variablen z.b. v_table_name oder
cursor c_imageid

hier will ich noch eine alternative darstellung zeigen
Code:
OPEN image_cursor FOR 'SELECT bildid FROM ' || table_name;

Code:
OPEN image_cursor FOR 'SELECT bildid FROM :s'  using table_name;
 
Zurück
Oben