パラメーターに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
は認識されません。
この作業を行うにはどうすればよいですか?
次のようなラッパー関数を作成できます。
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を意味すると仮定しました。
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'
を返します。
ドキュメント から:
データベース列に値
TRUE
およびFALSE
を挿入することはできません。列値を選択またはフェッチしてBOOLEAN
変数に入れることはできません。SQL
クエリから呼び出される関数は、BOOLEAN
パラメーターを使用できません。TO_CHAR
などの組み込みSQL
関数も使用できません。出力でBOOLEAN
値を表すには、IF-THEN
またはCASE
コンストラクトを使用してBOOLEAN
valuesを0
または1
、'Y'
、'N'
、'true'
、'false'
などオン。
SQL
データ型を受け取るラッパー関数を作成し、代わりに使用する必要があります。
BOOLEANデータ型はPL/SQLデータ型です。 Oracleは同等のSQLデータ型(...)を提供していません。SQL型をBOOLEAN型にマップするラッパー関数を作成できます。
これを確認してください: http://forums.datadirect.com/ddforums/thread.jspa?threadID=1771&tstart=0&messageID=5284
select get_something('NAME', sys.diutil.int_to_bool(1)) from dual;
データベースでこれをコンパイルし、クエリでブールステートメントの使用を開始します。
注:関数は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;
/
簡単に言えば、この質問に対する答えは次のとおりです。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
を使用すると、このクエリを実行するだけの外部依存関係がなくなります。 。 ここでこの手法について詳しく説明しました 。