Execute immediate select-Anweisung in Oracle
Ich bin mit execute immediate-Anweisung in einer meiner Abfragen.
procedure p1 (p_pk1_column, p_pk2_column , p_conv_table_name ,p_MODUE_NAME )
is
v_select_string := 'SELECT'''||p_MODUE_NAME||''',''' ||p_pk1_column || ''',''' || p_pk2_column ||''' FROM ' ||p_conv_table_name || v_where_condition;
execute immediate v_select_string ;
dbms_output.put_line('string:'||v_select_string );
end p1;
Hier bin ich ruft p1 Prozedur in einer anderen Prozedur p2
PROCEDURE P2 IS
v_pk1_column:='a';
v_pk2_columnm:='b';
v_mod_name:='mOD1';
p1(v_pk1_column,v_pk2_columnm);
end p2;
/
In p2-Prozedur a, b sind die Namen der Spalten p_conv_table_name . Ich möchte die select-Anweisung ausgeführt: select p_mod_name, a, b aus p_conv_table_name where-Bedingung, so dass Sie sollten geben Sie Werte für a-und b-Säulen in p_conv_table_name .
Aber es ist die Ausführung wie wählen Sie p_mod, p_pk1_col,p_pk2_col von p_conv_table_name where-Bedingung;
So einfach die Spaltennamen auswählen, wird statt der Werte in dieser Spalte.
Bitte deuten einige Konzept zur Verwirklichung von Werten in dieser Spalte.
Vielen Dank im Voraus
- sieht aus wie zu viele einfache Anführungszeichen zu mir? Anstelle von "WÄHLEN Sie a, b," etc. Sie werden beim ausführen von "SELECT 'a', 'b'," etc.
- Prüfen Sie einfach, Skript-Ausgabe und finden Sie, dass es wie
SELECT'z','zz','zzz' FROM zzzz
. Und es ist eine gute Praxis zu liefern, eine Frage mit syntaktisch korrekte Beispiele - Warum wollen Sie nicht, weder DBMS_SQL-Paket noch bind-Variablen? Es ist möglich, eine SQL injection beim erstellen der dynamischen Abfrage wie diese, die
DBMS_SQL
- und bind-Variablen helfen Sie zu vermeiden. - Als Abgang;, wenn Sie die Ausführung einer SELECT-Anweisung müssen Sie IN etwas...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn die
SELECT
Anweisung gebaut wird, den Namen der Spalten umgeben sind, in single-quotes, die sich in string-literalen. Ändern Sie Ihre Vorgehensweise, um so etwas wie:Habe ich auch geändert, den code zu
OPEN
undFETCH
einen cursor, anstatt mitEXECUTE IMMEDIATE
.OPEN
undFETCH
sind in der Regel besser geeignet für die Verwendung mit einem dynamischenSELECT
- Anweisung.Teilen und genießen.