Bindevariablen mit dynamischer SELECT INTO-Klausel in PL / SQL verwenden
Ich habe eine Frage bezüglich wo bind Variablen verwendet werden können, in einer dynamischen SQL-Anweisung in PL/SQL.
Zum Beispiel, ich weiß, dass dies gilt:
CREATE OR REPLACE FUNCTION get_num_of_employees (p_loc VARCHAR2, p_job VARCHAR2)
RETURN NUMBER
IS
v_query_str VARCHAR2(1000);
v_num_of_employees NUMBER;
BEGIN
v_query_str := 'SELECT COUNT(*) FROM emp_'
|| p_loc
|| ' WHERE job = :bind_job';
EXECUTE IMMEDIATE v_query_str
INTO v_num_of_employees
USING p_job;
RETURN v_num_of_employees;
END;
/
Ich Frage mich, ob man mit einem bind-Variablen in einer select-Anweisung wie diese
CREATE OR REPLACE FUNCTION get_num_of_employees (p_loc VARCHAR2, p_job VARCHAR2)
RETURN NUMBER
IS
v_query_str VARCHAR2(1000);
v_num_of_employees NUMBER;
BEGIN
v_query_str := 'SELECT COUNT(*) INTO :into_bind FROM emp_'
|| p_loc
|| ' WHERE job = :bind_job';
EXECUTE IMMEDIATE v_query_str
USING out v_num_of_employees, p_job;
RETURN v_num_of_employees;
END;
/
Note, die ich verwendet eine SELECT INTO-Anweisung als meine dyamic string und verwendet eine bind-Variablen in der INTO-Klausel.
Ich bin gerade unterwegs und jetzt keinen Zugriff auf meinen computer zu Hause für ein paar Tage, aber dies wurde nörgelnden mich ein bisschen. Habe versucht, das Lesen der PL/SQL-Referenz, aber Sie haben nicht ein Beispiel für eine select wie dieses.
Dank
Kommentar zu dem Problem
Verwandte: stackoverflow.com/q/25489002/1461424
InformationsquelleAutor der Frage BYS2 | 2011-10-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein, Sie können nicht verwenden Sie bind-Variablen, die Art und Weise. In Ihrem zweiten Beispiel
:into_bind
imv_query_str
ist nur ein Platzhalter für den Wert der variablev_num_of_employees
. Die select into-Anweisung wird in etwas wie:da der Wert des
v_num_of_employees
istnull
beiEXECUTE IMMEDIATE
.Ihre erste Beispiel zeigt den richtigen Weg, um binden Sie den Rückgabewert an eine variable.
Bearbeiten
Den original-poster bearbeitet hat der zweite code-block, ich beziehe mich in meiner Antwort verwenden
OUT
parameter Modus fürv_num_of_employees
anstelle der Standard -IN
- Modus. Diese änderung macht die beiden Beispiele, die funktional äquivalent sind.InformationsquelleAutor der Antwort user272735
Meiner Meinung nach, eine dynamische PL/SQL-block ist etwas dunkler. Während sehr flexibel ist, ist auch schwer zu Stimmen, schwer zu Debuggen und zu hart, um herauszufinden, was Los ist.
Meine Stimme geht an Ihre erste option,
Beide verwendet, bind-Variablen, aber zuerst, für mich ist das mehr redeable und abstimmbarer als @jonearles option.
InformationsquelleAutor der Antwort Aitor
Setzen Sie die select-Anweisung in einer dynamischen PL/SQL-block.
InformationsquelleAutor der Antwort Jon Heller
Bind-variable kann verwendet werden in Oracle-SQL-Abfrage mit "in" - Klausel.
Arbeitet in 10g; ich weiß nicht, über andere Versionen.
Bind-variable ist vom Datentyp varchar mit bis zu 4000 Zeichen.
Beispiel: Bind-variable enthält eine Komma-getrennte Liste von Werten, z.B.
:bindvar = 1,2,3,4,5
(Gleiche info, wie ich hier gepostet: Wie gibst du die IN-Klausel in eine dynamische Abfrage mit einer variable? )
InformationsquelleAutor der Antwort Kat
Wählen Sie In Funktionalität funktioniert nur für PL/SQL-Block, wenn Sie Execute immediate , oracle interpretiert v_query_str als SQL-Abfrage-string, so dass Sie nicht verwenden können .erhalten Stichwort fehlende Ausnahme.
in Beispiel 2 sind wir mit begin end; so wurde es pl/sql-block und seine rechtliche.
InformationsquelleAutor der Antwort Khilan Shah