2016-05-14 19 views
0

Ich möchte alle Zeilen und Felder aus einer Tabelle zurückgeben, wo weder der Tabellenname noch die Feldnamen im Voraus bekannt sind. Etwas wie:Wie benennt man Tabelle dynamisch in Oracle SQL Select Statement?

select * from [TABLENAME]

diese andere Methode sieht vielversprechend aus, aber select * from test_cursor gibt „Versuch, den Zugriff auf Zeilen eines Artikels, dessen Typ nicht bekannt ist ...“ https://stackoverflow.com/a/101064/209942

EXECUTE IMMEDIATE scheint vielversprechend, aber ich lesen Sie, dass das Zurückgeben mehrerer Zeilen einen Cursor erfordert, und ich kann kein Beispiel finden.

Bevorzugen Sie eine Lösung, die sehr einfach und schnell ist (dh, Zeile für Zeile vermeiden möchten).

Möchten Sie vermeiden, eine Funktion oder Prozedur zu erstellen, aber vielleicht ist das unvermeidlich. Vielleicht muss ich eine Tabellenfunktion verwenden?

Vielleicht etwas wie das Folgende?

CREATE OR REPLACE FUNCTION GetTable(table_name CHAR) 

BEGIN 

EXECUTE IMMEDIATE 'CREATE TABLE temp_table 
    AS (SELECT * FROM :1)' USING table_name; 

END; 

SELECT * FROM table (temp_table) 

thx

+0

prüfen Paket [ DBMS_SQL] (https://docs.oracle.com/database/121/ARPLS/d_sql.htm#ARPLS058), dort können Sie vollständige dynamische SQL-Anweisungen ausführen. –

Antwort

0

Der schwierigste Teil Ihrer Anforderung ist die Datentyp Konsistenz der Spalten, die Sie erhalten möchten, und Anzahl der Spalten, die unterschiedlich sein können zwischen den einzelnen Tabellenname Sie auswählen möchten.

Für Ihre Frage, könnten Sie verwenden:

  1. dynamische SQL und Global Temporary Table: Nur wenn fieldname1 und FieldName2 immer Datentyp Spiel col1 und col2 Ihrer global_temp haben (Sie müssen global_temp Tabelle erstellen zuerst).

    delete global_temp; 
    sql_stmt := 'insert into global_temp(col1,col2) 
          SELECT '|| fieldname1 || ',' || fieldname2 
          ||' FROM ' || var_table_name; 
    EXECUTE IMMEDIATE sql_stmt; 
    select * from global_temp; --do any thing with result temp table 
    
  2. dynamic SQL into records (Schleife jede Zeile Ergebnisse zu erhalten): Wechseln Sie zu verbinden, Suche emp_rec

-1

Diese Antwort keine Kenntnis von Feldtypen oder Zahl benötigt.

Die kurze Antwort lautet:

EXECUTE IMMEDIATE 'CREATE TABLE temp_table AS (SELECT * FROM ' ||table_name||')'; 

SELECT * FROM temp_table; 

Die lange Antwort ist:

DROP TABLE TEMP_TABLE; 

DECLARE table_name VARCHAR2(200); 

BEGIN 
    table_name := 'subreports'; 
    EXECUTE IMMEDIATE 'CREATE TABLE temp_table AS (SELECT * FROM ' ||table_name||')'; 
END; 

SELECT * FROM temp_table; 

Oder, wie es ein Verfahren (jemand, meine Syntax korrigieren):

create procedure GetTable (table_name in VARCHAR2(200), result_set out sys_refcursor) 
    is 
    begin 
    DROP TABLE TEMP_TABLE PURGE; 
    EXECUTE IMMEDIATE 'CREATE TABLE temp_table AS (SELECT * FROM ' ||table_name||')'; 
     open result_set for select * from temp_table; 
    end;