8

boolOracle 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、極端な例では過度に複雑になる可能性があり、ケース固有でもあります。

私が言うように、どこかに独創的な解決策があることを願っています (または、少なくとも私がたまたま見落としていた非常に単純な解決策)。

御時間ありがとうございます。

4

1 に答える 1

6

次のように独自のラッパーを作成できます。

CREATE OR REPLACE FUNCTION my_bool_to_str(f varchar2) RETURN VARCHAR2 IS

  b varchar2(2);

BEGIN

  EXECUTE IMMEDIATE 'declare bl boolean; begin bl := ' || f ||
                    '; if bl then :1 := ''y''; else :1 := ''n''; end if; end;'
    using out b;

  return b;

END;

次に、次のように呼び出すことができます。

SELECT part_no,
       my_bool_to_str('stock_pkg.is_in_stock('|| part_no|| ')') in_stock
FROM   parts_table

ラッパーとの違いは、入力として varchar を取得し、SQL エンジンが認識しないブール値を取得することです。

于 2012-11-21T11:17:54.470 に答える