Bool unterstützt Oracle SQL

8

Es ist eine ständige Frustration von mir, dass Oracle PL / SQL den Datentypen bool unterstützt, während Oracle SQL das nicht tut. Es ist ein großer Schmerz im sprichwörtlichen Sinne, wenn Sie einen booleschen PL / SQL-Rückgabewert in Ihre alltägliche SQL zurückverwandeln möchten (Beispiel unten).

Sogar die ask-Tom-Website ist blasiert über diesen Fehltritt und berichtet, dass Sie boolesche Spalten als Festwert 'Y'/'N' CHAR -Spalten codieren sollten, was eine so schlechte Antwort auf so viele verschiedene Ebenen ist, dass ich nicht weiß, Ich weiß, wo ich anfange, es zu kritisieren. Tatsächlich ist die einzige einlösende Eigenschaft dieser Antwort die Tatsache, dass (soweit ich kürzlich herausgefunden habe) viele andere Datenbank-Engines den booleschen Datentyp nicht unterstützen.

Wie auch immer - die Frage ...

Ich habe eine Lösung für das folgende Problem (wenn auch unordentlich und wortreich), also stelle ich diese Frage eher aus Neugier als aus Notwendigkeit. Aber eines der wenigen Dinge, die mich noch mehr überraschen, ist der Einfallsreichtum schlauer Programmierer, also hoffe ich, dass einer von euch eine Lösung für Folgendes finden kann.

Im folgenden Beispiel gibt die Funktion stock_pkg.is_in_stock() (die ein fester Bestandteil meiner Anwendung ist) einen BOOL-Wert zurück, der das SQL ungültig macht (denken Sie daran, dass SQL BOOL nicht unterstützt):

%Vor%

Was ich brauche, ist einen Weg zu finden, den obigen Funktionsaufruf zu benutzen, um eine gültige Zeichenkette (varchar) des Formats zu erzeugen:

%Vor%

(Sie können "Ja / Nein" für "Wahr / Falsch", "Grün / Rot", "Tory / Arbeit" oder sogar numerische 1/0 für alles, was mir wichtig ist, ersetzen - nur solange die Ausgabe in eins fällt von zwei verschiedenen Kategorien.)

Leider habe ich nicht das Recht, die ursprüngliche Funktion neu zu schreiben, um einen anderen Datentyp zurückzugeben. Und außerdem gibt es Tausende von Funktionen wie diese, die um die größere Anwendung verteilt sind, was es unmöglich macht, sie alle neu zu schreiben.

In diesem Sinne muss die Lösung eine "generische" sein (d. h. nicht spezifisch für diesen Funktionsaufruf). Zum Beispiel reicht es nicht aus, die Funktion als stock_pkg.is_in_stock_chr() neu zu schreiben, denn das würde bedeuten, dass ich auch alle anderen ähnlichen Funktionen in meiner Anwendung neu schreiben müsste.

Ich habe es schon versucht:

%Vor%

und sogar meine eigene Wrapper-Funktion:

%Vor%

Aber selbst Booleans in andere funktionale Konstrukte einzufügen scheint von Oracle SQL nicht erlaubt zu sein (zumindest nicht in Oracle 10g).

Es gibt auch die Möglichkeit, innerhalb der Spalte in_stock eine Unterauswahl zu schreiben, aber das könnte auch in extremen Beispielen zu kompliziert werden und wäre auch fallspezifisch.

Wie ich schon sagte, ich hoffe, es gibt irgendwo eine geniale Lösung (oder zumindest eine sehr einfache, die ich zufällig übersehen habe).

Danke für Ihre Zeit.

    
cartbeforehorse 21.11.2012, 10:44
quelle

1 Antwort

6

Sie können Ihren eigenen Wrapper so schreiben:

%Vor%

Dann kannst du es so nennen:

%Vor%

Der Unterschied zu Ihrem Wrapper besteht darin, dass er einen VARCHAR als Eingabe und keinen booleschen Wert erhält, den die SQL-Engine nicht erkennt

    
A.B.Cade 21.11.2012, 11:17
quelle

Tags und Links