2017-06-09 1 views
0

Arbeits Ich habe eine PL/SQL-Funktion wie folgt aus:PL/SQL: varchar2 als IN-Parameter funktionieren nicht

FUNCTION find_by_items(items IN varchar2) 
RETURN SYS_REFCURSOR 
AS 
    o_cursor SYS_REFCURSOR; 
BEGIN 
    open o_cursor for select a.something from my_table a where a.item in (items); 
    return o_cursor; 
END find_by_items; 

Diese immer einen leeren Cursor zurückgibt.

Wenn ich führen Sie es mit, zum Beispiel:

select find_by_items('''one'', ''two'', ''three'''); 

ich einen leeren Cursor.

Stecke ich die SQL-Anweisung in einer Zeichenfolge und revidieren die Funktion wie:

FUNCTION find_by_items(items IN varchar2) 
RETURN SYS_REFCURSOR 
AS 
    o_cursor SYS_REFCURSOR; 
    strSql varchar2(32767); 
BEGIN 
    strSql := 'select a.something from my_table a where a.item in (' || items || ')'; 
    open o_cursor for strSql; 
    return o_cursor; 
END find_by_items; 

Und ich rufe die Funktion genau die gleiche Art und Weise:

select find_by_items('''one'', ''two'', ''three'''); 

ich die Ergebnisse erhalten, erwarte ich (kein leeres Cursor)

-

Grundsätzlich, um herauszufinden, wie ich versuche, um den ersten Weg zu gehen, weil die Verwendung eines Strings bedeutet, dass es anfälliger für Laufzeitfehler ist, anstatt Fehler zu kompilieren - was in meinem speziellen Fall nicht vorzuziehen ist.

Dank

+0

Mit IN auf varchar überprüfen, ob einer Ihrer Artikel einen Namen von '' 'eins' ',' 'zwei' ',' 'drei' '' hat. Natürlich gibt es keinen solchen Gegenstand. Sie müssen diese in eine temporäre Tabelle aufteilen und dann aus der Tabelle auswählen. –

+0

Haben Sie versucht, Ihre Zeichenfolge in eine Liste zu konvertieren? Z.B. mit dbms_utility.comma_to_table – RaphaMex

Antwort

0

Die erste Implementierung wird nie während der Arbeit erwarten, da Oracle die Abfrage löst wie folgt:

select a.something from my_table a where a.item in ('''one'', ''two'', ''three''') 

und was Ihr Mangel ist

select a.something from my_table a where a.item in ('one', 'two','three') 

Split und speichern Sie Ihre Zeichenfolge Parameterwerte in eine Varray, so dass Sie das folgende Formular verwenden können:

select a.something from my_table a where a.item in (table(varray_var)); 
Verwandte Themen