nie vergessen, dass in Oracle SQL die ''
wörtliche (leere Zeichenkette) ist die gleiche wie NULL
, damit Ihr Prädikat e.ColumnName != ''
entspricht e.ColumnName != null
die immer NULL
auswertet.
Das zweite Problem ist, dass Sie versuchen, einen booleschen Wert von Ihrem CASE
auszugeben. Nein, Oracle kann keine booleschen Ausdrücke als Ergebnisse von Funktionen verwenden. (Lassen Sie sich CASE
betrachtet eine Funktion zu sein, da ich nicht einen Eigennamen für diese Sprachkonstrukte jetzt erinnern kann.)
es auf diese Weise versuchen:
PROCEDURE GetBatchTotals(pEntityName VARCHAR DEFAULT NULL) IS
BEGIN
-- Sample Query
SELECT ColumnName
FROM TableName e
WHERE
(pEntityName IS NULL AND e.ColumnName is not null) OR
(pEntityName IS NOT NULL AND e.ColumnName = pEntityName);
END GetBatchTotals;
Es gibt noch ein paar Probleme mit Ihrem Code, lassen sie haben sie behoben:
(1) Verwenden Sie nicht varchar
, verwenden Sie stattdessen varchar2
. Eine seltsame "Verbesserung" von Oracle, frag nicht.
(2) Für Gleichheit mit nicht NULL
Werten Prädikate Sie das Prädikat weglassen können pEntityName is not null
von einem des AND
es, wird es impliziert werden.
(3) Prädikat e.ColumnName is not null
filtert wirklich die Zeilen, wo e.ColumnName
NULL
ist, die etwas anderes von Ihrer ursprünglichen Idee ist, alle Zeilen unabhängig von ihrem e.ColumnName
Wert abzufragen.
(4) Entweder Schleife durch die Abfrage Ergebnisse oder Bulk holen sie in eine Sammlung oder geben Sie sie als Ref-Cursor. In PL/SQL müssen Sie setzen die Abfrageergebnisse in etwas! Lassen Sie sich eine Schleife durch die Abfrageergebnisse und spult die ColumnName
Inhalte zu Server-Ausgabe ...
PROCEDURE GetBatchTotals(pEntityName VARCHAR2 DEFAULT NULL) IS
BEGIN
for rec in (
SELECT ColumnName
FROM TableName e
WHERE pEntityName IS NULL -- Just to select everything in the table
OR e.ColumnName = pEntityName
) loop
dbms_output.put_line(rec.ColumnName);
end loop;
END GetBatchTotals;
Ihre zweite Abfrage sollte funktionieren. Dis Sie versuchen, es lokal auszuführen? Auch eine eigenständige select-Anweisung ist in einer Prozedur nicht erlaubt. Geben Sie Beispieldaten an und replizieren Sie das Problem. – Utsav
Ich habe der ursprünglichen Frage zusätzliche Informationen hinzugefügt ... – Morgs
In Oracle gibt es keine leere Zeichenfolge. Wenn Sie möchten, dass Ihre Abfrage funktioniert, müssen Sie '! = ''' In 'is not null' umwandeln. Oder entfernen Sie diese Bedingung möglicherweise vollständig, wenn Sie alle Zeilen auswählen möchten, unabhängig davon, ob e.columnname null ist oder nicht. – Boneist