私はOracle 11gを使用していますが、問題がどこにあるのか理解できません。私はもっと難しいものを作りましたが、私は過去5時間、この単純なことに失敗しました:
これは関数本体です
FUNCTION legal_user(
level_existance number
,types_with_impel number)
RETURN BOOLEAN
IS
v_ret_val BOOLEAN;
BEGIN
v_ret_val := FALSE;
IF (level_existance*types_with_impel>0) then
v_ret_val := TRUE;
DBMS_OUTPUT.PUT_LINE('true');
else
DBMS_OUTPUT.PUT_LINE('false');
END IF;
return v_ret_val;
END legal_user;
これは仕様です:
FUNCTION legal_user(
level_existance number
,types_with_impel number)
RETURN BOOLEAN;
論理ANDと同等
A*B>0?true:false;
私が得ているエラーメッセージは
ORA-06552:PL/SQL:ステートメントが無視されましたORA-06553:PLS-382:式のタイプが不正です06552。00000-"PL/SQL:%s" *原因:
*アクション:行のエラー:1列:7
これは、IDEで実行する方法です。
SELECT compt_tree_profile_q.legal_user(1,1)
FROM dual
純粋なSQLはブール型を認識しませんが、PL/SQLは認識します。したがって、クエリでは、この関数が返すデータ型がわかりません。
関数は機能するので、別のpl/sqlブロックで使用できます
declare
myvar boolean;
begin
myvar := compt_tree_profile_q.legal_user(1,1);
end;
ただし、この関数を純粋な選択ステートメントで使用することはできません。
関数はブール値を返します。このデータ型はPL/SQLに認識されていますが、SQLクエリを使用しています。 SQLはブール値の処理方法を認識していないため、「式の型が間違っています」と言います。
よろしく、
ロブ。
これをSQL内で呼び出す場合、独自にロールするのではなく、組み込みのSIGN関数を使用できます。
関数は、パラメーターの符号に応じて-1、0、または1を返します(それぞれ負、ゼロ、または正)。
使用方法は次のとおりです。
SIGN(level_existance*types_with_impel)
そして、それをCASEステートメントに組み込む方法:
SELECT CASE WHEN (SIGN(level_existance*types_with_impel) = 1)
THEN 'TRUE'
ELSE 'FALSE'
END legal_user
FROM ...
この場合、文字列( 'TRUE'または 'FALSE')を返すだけですが、SELECTステートメント内で有効なもの(列、SYSDATEなど)を返すことができます。