14

私はOracle11gを使用していますが、問題がどこにあるのか理解できません。私はもっ​​と難しいものを作りましたが、この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;

これは論理積と同等です

         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 
4

3 に答える 3

25

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

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

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

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

于 2011-03-10T14:02:51.297 に答える
17

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

よろしく、
ロブ。

于 2011-03-10T14:02:45.340 に答える
1

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

于 2011-03-11T19:14:30.647 に答える