2017-10-16 2 views
0

ich einen klassischen Bericht erschaffe (basierend auf Function) mit dem folgenden Code:Oracle APEX Fehler ORA-01460 ORA-02063

declare 
    q long; 
begin 
-- The query with any conditions always applied 
    q := 'select * from name_selection_atnd where 1 = 1'; 

-- If all items are null then kill query 
if :P500_FN is null 
    and :P500_LN is null 
then 
    q := q || ' and name_said = 0'; --will always return 0 rows 
end if; 

-- Append any optional conditions 
if :P500_FN is not null then 
    q := q || ' and name_first_name = :P500_FN'; 
end if; 

if :P500_LN is not null then 
    q := q || ' and name_last_name = :P500_LN'; 
end if; 

return q; 
end; 

Mein letzter Code wird außerdem zuerst müssen, um weitere Elemente enthält, um zu suchen und letzten Name, aber jetzt teste ich gerade mit diesen beiden Parametern. Wenn ich nur einen Vornamen eintippe, funktioniert die Suche. Wenn ich nur einen Nachnamen ausfülle, funktioniert es. Wenn ich einen Vor- und Nachnamen eintippe, erhalte ich den Fehler ORA-01460 und ORA-02063.

Was könnte ich falsch machen?

+0

Was geben Sie für 'P500_FN' ein? Warum verwenden Sie Bind Variable überall. Verwenden Sie in declare nur einmal, um den Wert aus der Bindevariablen in eine lokale Variable zu übernehmen. Vergleiche diese Variablen. –

+0

Ich tippe eine Zeichenfolge. Nur der Vorname einer Person –

+0

Können Sie die vollständigen Fehlermeldungen anstatt nur die Codes geben? – MT0

Antwort

1

ich, dass Sie bind Variablen innerhalb '' sehen können, die in einem PLSQL Block nie ausgewertet werden würde:

q := q || ' and name_first_name = :P500_FN'; 

Dieses so sein sollte :

q := q || ' and name_first_name = '||:P500_FN; 
+0

Großartig! Aber jetzt, wenn ich einen Namen wie 'Jordan' eintippe, erhalte ich diesen Fehler ORA-00904: "JORDAN": ungültiger Bezeichner –

+0

@JordanHolmer Sie müssen 'Jordan' als eine Zeichenkette übergeben, also muss es in' Jordan' sein, wenn Du passierst es. Sie müssen einfache Anführungszeichen (') angeben, wenn Sie Werte übergeben. – XING

+0

Danke! Ich habe es jetzt funktioniert –

0

Sie brauchen keine dynamische SQL:

SELECT * 
FROM name_selection_atnd 
WHERE (:P500_FN IS NULL OR name_first_name = :P500_FN) 
AND (:P500_LN IS NULL OR name_last_name = :P500_LN) 
AND (:P500_FN IS NOT NULL OR :P500_LN IS NOT NULL); 
+0

Ich bekomme die gleichen Fehler, wenn ich das tue –