bool
Oracle PL/SQL ではデータ型がサポートされているのに、Oracle SQL ではサポートされていないことに、常に不満を感じています。PL/SQL ブール値の戻り値を処理して日常の SQL に戻すのは、ことわざの大きな苦痛です (以下の例)。
ask-Tom の Web サイトでさえ、この不適合について無礼であり、ブール型の列を固定値の列としてコーディングする必要があると報告しています'Y'/'N' CHAR
。それ。実際、この応答の唯一の利点は、(私が最近発見した限りでは) 他の多くのデータベース エンジンも boolean データ型をサポートしていないという事実です。
とにかく - 質問...
次の問題の回避策があります (面倒で冗長ではありますが) ので、必要ではなく好奇心からこの質問をしています。しかし、これ以上私を驚かせる数少ないことの 1 つは、賢いプログラマーの創意工夫です。そのため、あなたの 1 人が次の解決策を思い付くことができることを期待しています。
次のサンプルでは、関数stock_pkg.is_in_stock()
(アプリケーションに固有の部分) が BOOL 値を返し、SQL を無効にします (SQL は BOOL をサポートしていないことに注意してください)。
SELECT part_no, stock_pkg.is_in_stock(part_no) in_stock
FROM parts_table
必要なのは、上記の関数呼び出しを使用して、次の形式の有効な文字列 (varchar) 出力を生成する方法を見つけることです。
PART_NO IN_STOCK
------- ------------
AA YES
BB NO
CC NO
(「真/偽」、「緑/赤」、「トーリー/労働」の代わりに「はい/いいえ」を使用することもできますし、出力が 2 つの異なる値のいずれかに該当する限り、私が気にかけているすべてを数値の 1/0 に置き換えることもできます。カテゴリ)
残念ながら、元の関数を書き直して別のデータ型を返す権限はありません。さらに、大規模なアプリケーションにはこのような関数が何千も点在しているため、すべてを書き直すことは現実的ではありません。
したがって、この意味で、ソリューションは「一般的な」ものでなければなりません (つまり、この関数呼び出しに固有のものではありません)。たとえば、関数を として書き直すだけでは不十分です。これstock_pkg.is_in_stock_chr()
は、アプリケーション内の他の同様の関数もすべて書き直す必要があるためです。
私はすでに試しました:
SELECT part_no,
CASE WHEN stock_pkg.is_in_stock(part_no) THEN 'y' ELSE 'n' END in_stock
FROM parts_table
そして私自身のラッパー関数でさえ:
SELECT part_no,
my_bool_to_str(stock_pkg.is_in_stock(part_no)) in_stock
FROM parts_table
しかし、ブール値を他の関数構造内にラップすることでさえ、Oracle SQL では許可されていないようです (少なくとも Oracle 10g では許可されていません)。
列内にサブ選択を記述するオプションもありますがin_stock
、極端な例では過度に複雑になる可能性があり、ケース固有でもあります。
私が言うように、どこかに独創的な解決策があることを願っています (または、少なくとも私がたまたま見落としていた非常に単純な解決策)。
御時間ありがとうございます。