62

パラメータに BOOLEAN を含む PL/SQL 関数があります。

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

この機能はサードパーティ製ツールの一部です。これを変更することはできません。

この関数を SELECT ステートメント内で次のように使用したいと思います。

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

これは機能しません。次の例外が発生します。

ORA-00904: "TRUE": 識別子が無効です

私が理解しているように、キーワードTRUEは認識されません。

どうすればこれを機能させることができますか?

4

10 に答える 10

53

SELECTクエリからブール値を確実に取得できますが、ブールデータ型は使用できません。

ブール値は 1/0 で表すことができます。

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

1 を返します (Hibernate/Mybatis/etc では 1 が true)。それ以外の場合は、SELECT から印刷可能なブール値を取得できます。

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

これは文字列を返します'true'

于 2011-11-04T14:34:55.260 に答える
31

次のようなラッパー関数を作成できます。

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

次に呼び出します。

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

バージョンでignore_notfoundの有効な値が何であるかはあなた次第です。私は「TRUE」がTRUEを意味し、それ以外はFALSEを意味すると想定しています。

于 2009-09-23T11:32:24.140 に答える
23

ドキュメントから:

TRUE値をFALSEデータベース列に挿入することはできません。BOOLEAN列の値を選択したり、変数にフェッチしたりすることはできません。クエリから呼び出される関数は、パラメーターSQLを取ることはできません。などの組み込み関数BOOLEANもできません。出力で値を表すには、 or構成を使用して、値をor 、or 、orなどの他の型に変換する必要があります。SQLTO_CHARBOOLEANIF-THENCASEBOOLEAN01'Y''N''true''false'

SQLデータ型を受け取り、代わりに使用するラッパー関数を作成する必要があります。

于 2009-09-23T11:32:40.737 に答える
5

BOOLEAN データ型は PL/SQL データ型です。Oracle は同等の SQL データ型を提供していません (...)。SQL 型を BOOLEAN 型にマップするラッパー関数を作成できます。

これを確認してください:http://forums.datadirect.com/ddforums/thread.jspa?threadID=1771&tstart=0&messageID=5284

于 2009-09-23T11:35:13.360 に答える
3
select get_something('NAME', sys.diutil.int_to_bool(1)) from dual;
于 2011-12-27T07:20:45.330 に答える
2

これをデータベースでコンパイルし、クエリでブール式の使用を開始します。

注:関数getはvarchar2 paramであるため、ステートメント内の「文字列」は必ずラップしてください。trueの場合は1を返し、falseの場合は0を返します。

select bool('''abc''<''bfg''') from dual;

CREATE OR REPLACE function bool(p_str in varchar2) return varchar2 
 is
 begin

 execute immediate ' begin if '||P_str||' then
          :v_res :=  1;
       else
          :v_res :=  0;
       end if; end;' using out v_res;

       return v_res;

 exception 
  when others then 
    return '"'||p_str||'" is not a boolean expr.';
 end;
/
于 2011-01-13T15:24:19.120 に答える
2

Oracle 12 では、WITH句を使用して補助関数を宣言できます。私はあなたのget_something関数が返すと仮定していますvarchar2:

with
  function get_something_(name varchar2, ignore_notfound number)
  return varchar2 
  is
  begin
    -- Actual function call here
    return get_something(name, not ignore_notfound = 0);
  end get_something_;

  -- Call auxiliary function instead of actual function
select get_something_('NAME', 1) from dual;

もちろん、この回答に示されているように、補助関数をスキーマのどこかに保存することもできますが、を使用するWITHと、このクエリを実行するためだけに外部依存関係がなくなります。この手法については、こちらのブログで詳しく説明しています

于 2019-04-16T13:01:33.000 に答える
-2

TRUE (または FALSE) と評価される式を使用するのはどうですか?

select get_something('NAME', 1 = 1) from dual
于 2009-09-23T11:38:33.643 に答える
-4

PL/SQL は、TRUE が有効な識別子または変数ではないことを訴えています。ローカル変数を設定して TRUE に設定し、get_something 関数に渡します。

于 2009-09-23T11:32:18.290 に答える