web-dev-qa-db-ja.com

ブール値を返す関数が「式のタイプが間違っています」で失敗する

私は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 
14
yoav.str

純粋なSQLはブール型を認識しませんが、PL/SQLは認識します。したがって、クエリでは、この関数が返すデータ型がわかりません。

関数は機能するので、別のpl/sqlブロックで使用できます

declare
myvar boolean;
begin
   myvar := compt_tree_profile_q.legal_user(1,1);
end;

ただし、この関数を純粋な選択ステートメントで使用することはできません。

24

関数はブール値を返します。このデータ型はPL/SQLに認識されていますが、SQLクエリを使用しています。 SQLはブール値の処理方法を認識していないため、「式の型が間違っています」と言います。

よろしく、
ロブ。

17
Rob van Wijk

これを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など)を返すことができます。

1
Bernard