2009-09-23 5 views
39

ich eine PL/SQL-Funktion mit BOOLEAN in Parameter haben:Wie BOOLEAN Typ in SELECT-Anweisung verwenden

function get_something(name in varchar2, ignore_notfound in boolean); 

Diese Funktion ist Teil von 3rd-Party-Tool, das kann ich nicht ändern.

Ich mag diese Funktion in einer SELECT Anweisung wie folgt verwenden:

select get_something('NAME', TRUE) from dual; 

dies nicht funktioniert, bekomme ich diese Ausnahme:

ORA-00904: "TRUE": ungültig Bezeichner

Wie ich es verstehe, wird das Schlüsselwort TRUE nicht erkannt.

Wie kann ich das schaffen?

Antwort

24

Sie können einen Wrapper-Funktion wie dieses bauen

select get_something('NAME', 'TRUE') from dual; 

Es liegt an Ihnen, was die gültigen Werte von ignore_notfound in Ihrer Version sind, bin ich davon ausgegangen, ‚TRUE 'bedeutet TRUE und alles andere bedeutet FALSE.

+11

Komm auf Orakel, das ist eine wirklich dumme Einschränkung – craigrs84

+8

Ich bin gespannt, wie Oracle dies technisch begründet. –

-1

PL/SQL beschwert sich, dass TRUE kein gültiger Bezeichner oder eine gültige Variable ist. Richten Sie eine lokale Variable ein, setzen Sie sie auf TRUE und übergeben Sie sie an die Funktion get_something.

function get_something(name in varchar2, 
        ignore_notfound in varchar2) return varchar2 
is 
begin 
    return get_something (name, (upper(ignore_notfound) = 'TRUE')); 
end; 

rufen:

+4

Nein, Oracle SQL einfach nicht Boolesche Werte :-( –

+0

plus verarbeiten kann, möchte ich diese Funktion in einer View-Definition verwenden, nicht in einem Skript –

+0

@Ula, Tony. Dann denke ich, die Funktion Verpackung ist –

19

Von documentation:

Sie können nicht die Werte einfügen TRUE und FALSE in einer Datenbankspalte. Sie können Spaltenwerte nicht in eine BOOLEAN Variable auswählen oder abrufen. Funktionen, die von einer SQL Abfrage aufgerufen werden, können keine BOOLEAN Parameter annehmen. Weder kann eingebaut SQL Funktionen wie TO_CHAR; darzustellen BOOLEAN Werte in der Ausgabe, müssen Sie IF-THEN oder CASE Konstrukte verwenden BOOLEAN Werte in eine andere Art, wie 0 oder 1, 'Y' oder 'N', 'true' oder 'false', und so weiter zu übersetzen.

Sie müssen eine Wrapper-Funktion erstellen, die einen SQL-Datentyp verwendet und stattdessen verwendet.

-1

Wie wäre es unter Verwendung eines Ausdrucks, der TRUE (oder FALSCH)?Verwendung von Booleschen Anweisungen in Ihrer querys

select get_something('NAME', 1 = 1) from dual 
+0

Das funktioniert nicht, bekomme ich Syntaxfehler. –

+1

Funktioniert nicht ... – GabrielOshiro

2

Kompilieren diese in Ihrer Datenbank und starten.

hinweis: die funktion erhalten ist ein varchar2 param, so sicher sein, alle "strings" in ihre aussage zu wickeln. Es gibt 1 für wahr und 0 für falsch zurück;

38

Sie können definitiv Boolean Wert von einer SELECT-Abfrage erhalten, Sie können einfach keinen booleschen Datentyp verwenden.

Sie können einen Booleschen Wert mit 1/0 darstellen.

CASE WHEN (10 > 0) THEN 1 ELSE 0 END (It can be used in SELECT QUERY) 

SELECT CASE WHEN (10 > 0) THEN 1 ELSE 0 END AS MY_BOOLEAN_COLUMN 
    FROM DUAL 

Rückkehr, 1 (in Hibernate/Mybatis/etc 1 ist wahr). Andernfalls können Sie druckbare boolesche Werte aus einem SELECT abrufen.

SELECT CASE WHEN (10 > 0) THEN 'true' ELSE 'false' END AS MY_BOOLEAN_COLUMN 
FROM DUAL 

Dies gibt die Zeichenfolge 'true' zurück.

+1

Genau was Ich suchte nach. Danke! – Baxter

+2

Völlig irrelevant für die Frage obwohl. Die Frage war nicht "wie verwende ich Zahlen anstelle von booleans". – cartbeforehorse

3
select get_something('NAME', sys.diutil.int_to_bool(1)) from dual;