2016-03-18 17 views
1

Ich versuche, Tabellennamen und Spaltennamen an eine gespeicherte Prozedur in Oracle passieren, aber es gibt mir folgende Fehlermeldung: table or view does not existPassing Tabellennamen und Spaltennamen dynamisch auf PL/SQL Stored Procedure

Unten ist der Code:

create or replace procedure jz_dynamic_sql_statement 
    (p_table_name in varchar2, 
    p_col1_name  in varchar2, 
    p_check_result out integer) 

    as 

    v_error_cd   est_runtime_error_log.error_cd%type; 
    v_error_msg   est_runtime_error_log.error_msg%type; 
    v_sql    varchar2(1024); 
    v_result   number(10); 

    begin 
    v_result := 0; 
    v_sql  := 'select count(*) from ' || p_table_name ||' WHERE COLUMNNAME=' || p_col1_name; 


    execute immediate v_sql into v_result; 
    p_check_result := v_result; 

    end; 
+1

Was dies ist verwirrend? Die Tabelle existiert nicht. –

+0

Ich meine, ich habe den Tisch schon. – akaminko

+0

Die where-Klausel macht keinen Sinn, wenn Sie nicht versucht haben, Ihre DB-Spaltennamen auf dem Post zu verschleiern. – Andrew

Antwort

1

Wenn der Fehler kommt, sagt wieder die Tabelle nicht existiert, das heißt, die Tabelle, die Sie in Pass nicht existiert oder der Benutzer, der die Prozedur unter keinen Zugriff ausgeführt wird, kann.

Sie können eine dbms_output.put_line-Anweisung hinzufügen, um die von Ihnen erstellte Abfrage anzuzeigen, und dann versuchen, sie selbst auszuführen, bevor Sie das sofortige Ausführen versuchen. Dann wissen Sie, welche Fehler Sie beheben müssen.

dbms_output.put_line('query : '||v_sql); 

Achten Sie darauf, dbms_output einzuschalten.

Auch, wie es aussieht, Sie versuchen, zu tun, müssen Sie den Spaltennamen UND Spaltenwert übergeben. Es sei denn, die Tabellen, die Sie abfragen, haben IMMER den Spaltennamen "COLUMNNAME".

Try this:

v_sql  := 'select count(*) from ' || p_table_name ||' WHERE COLUMNNAME=''' || p_col1_name|| ''''; 
+0

dieser läuft gut v_sql: = 'wähle count (*) von' || p_tabellenname || ''; aber wenn ich einschließe, wo mit dem Spaltennamen clause, dann gibt es folgenden Fehler oben. – akaminko

+0

hat die Tabelle, die Sie abfragen möchten, die Spalte "COLUMNNAME"? – mjf200

+0

Ja. Es hat eine Spalte mit dem Namen 'COLUMNNAME' – akaminko