web-dev-qa-db-ja.com

SELECTステートメントでBOOLEAN型を使用する方法

パラメーターに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は認識されません。

この作業を行うにはどうすればよいですか?

52
Ula Krukar

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

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を意味すると仮定しました。

28
Tony Andrews

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が真です)。それ以外の場合は、印刷可能なブール値をSELECTから取得できます。

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

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

47
Ash

ドキュメント から:

データベース列に値TRUEおよびFALSEを挿入することはできません。列値を選択またはフェッチしてBOOLEAN変数に入れることはできません。 SQLクエリから呼び出される関数は、BOOLEANパラメーターを使用できません。 TO_CHARなどの組み込みSQL関数も使用できません。出力でBOOLEAN値を表すには、IF-THENまたはCASEコンストラクトを使用してBOOLEANvaluesを0または1'Y''N''true''false'などオン。

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

20
Quassnoi

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

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

5
JuanZe
select get_something('NAME', sys.diutil.int_to_bool(1)) from dual;
2
Kanu Mundu

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

注:関数はvarchar2パラメーターを取得するため、ステートメント内の「文字列」を必ずラップしてください。 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;
/
2
Eran ben-ari

簡単に言えば、この質問に対する答えは次のとおりです。OracleでBOOLEANを使用しないでください。PL/ SQLは愚かであり、機能しません。別のデータ型を使用してプロセスを実行します。

Oracleデータソースを使用したSSRSレポート開発者への注意: BOOLEANパラメーターを使用できますが、実装方法に注意してください。 Oracle PL/SQLはBOOLEANとうまく連携しませんが、データがデータセットに存在する場合、TablixフィルターでBOOLEAN値を使用できます。 OracleデータソースでBOOLEANパラメータを使用したため、これは本当に私を驚かせました。しかし、そのインスタンスでは、SQLクエリではなく、Tablixデータに対してフィルタリングしていました。

データがSSRSデータセットフィールドにない場合、INTEGERパラメーターを使用してSQLを次のように書き換えることができます。

__

<ReportParameter Name="paramPickupOrders">
  <DataType>Integer</DataType>
  <DefaultValue>
    <Values>
      <Value>0</Value>
    </Values>
  </DefaultValue>
  <Prompt>Pickup orders?</Prompt>
  <ValidValues>
    <ParameterValues>
      <ParameterValue>
        <Value>0</Value>
        <Label>NO</Label>
      </ParameterValue>
      <ParameterValue>
        <Value>1</Value>
        <Label>YES</Label>
      </ParameterValue>
    </ParameterValues>
  </ValidValues>
</ReportParameter>

...

<Query>
<DataSourceName>Gmenu</DataSourceName>
<QueryParameters>
  <QueryParameter Name=":paramPickupOrders">
    <Value>=Parameters!paramPickupOrders.Value</Value>
  </QueryParameter>
<CommandText>
    where 
        (:paramPickupOrders = 0 AND ordh.PICKUP_FLAG = 'N'
        OR :paramPickupOrders = 1 AND ordh.PICKUP_FLAG = 'Y' )

データがSSRSデータセットフィールドにある場合、BOOLEANパラメーターでTablixフィルターを使用できます。

__

</ReportParameter>
<ReportParameter Name="paramFilterOrdersWithNoLoad">
  <DataType>Boolean</DataType>
  <DefaultValue>
    <Values>
      <Value>false</Value>
    </Values>
  </DefaultValue>
  <Prompt>Only orders with no load?</Prompt>
</ReportParameter>

...

<Tablix Name="tablix_dsMyData">
<Filters>
  <Filter>
    <FilterExpression>
        =(Parameters!paramFilterOrdersWithNoLoad.Value=false) 
        or (Parameters!paramFilterOrdersWithNoLoad.Value=true and Fields!LOADNUMBER.Value=0)
    </FilterExpression>
    <Operator>Equal</Operator>
    <FilterValues>
      <FilterValue DataType="Boolean">=true</FilterValue>
    </FilterValues>
  </Filter>
</Filters>

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を使用すると、このクエリを実行するだけの外部依存関係がなくなります。 。 ここでこの手法について詳しく説明しました

0
Lukas Eder