0

次のようにPL/SQLに関数があります(Oracle APEXで使用されています):

create or replace FUNCTION User_Levels(result OUT VARCHAR2)
RETURN VARCHAR2 IS

v_user_types employee.user_type%TYPE;
BEGIN
    SELECT user_type
INTO v_user_types
FROM Employee
WHERE upper(username) = v('APP_USER');
IF v_user_types = 1
THEN
result := 'TRUE';
ELSE
result := 'FALSE';
END IF; 
END User_Levels;​

通常の SQL で現在の出力を確認するためだけにこれを呼び出すにはどうすればよいでしょうか。つまり、実行時に True または False に評価されますか。

結果と呼ばれる OUT パラメータが本当に必要ですか?

4

2 に答える 2

1

SQL*Plus から:

var result varchar2(10);
var rc varchar2(10);

exec :rc := user_levels(:result);

print rc
print result

returnただし、句がないため、関数は無効です。返すことができるのは だけなので、それresultを out パラメータと戻り値の両方に持つのは冗長です。どちらを保持するかは、使用方法によって異なりますが、ここではより柔軟で適切な関数をお勧めします。

create or replace FUNCTION User_Levels
RETURN VARCHAR2 IS
    v_user_types employee.user_type%TYPE;
BEGIN
    SELECT user_type
    INTO v_user_types
    FROM Employee
    WHERE upper(username) = v('APP_USER');

    IF v_user_types = 1 THEN
        RETURN 'TRUE';
    ELSE
        RETURN 'FALSE';
    END IF;
END User_Levels;​
/

v('APP_USER')...賢明なことをすると仮定します。その後、次のことができます。

select user_levels from dual;
于 2013-04-24T18:39:51.753 に答える
0

動作するはずです。通常、変数 (v_user_types など) を作成し、それを返します (p_result)。また、 v('APP_USER') も大文字であることを確認する必要があります。

さらに、v('APP_USER') はアプリケーション変数であるため、SQL*PLUS またはコマンド プロンプトからこれを実行することはできません。したがって、APEX ページでこれをテストする必要があります。

create or replace FUNCTION User_Levels(p_result OUT VARCHAR2)
RETURN VARCHAR2 IS

v_user_types employee.user_type%TYPE;
p_result VARCHAR2(10);

BEGIN
    SELECT user_type
    INTO v_user_types
    FROM Employee
    WHERE upper(username) = v('APP_USER');

    IF (v_user_types = 1) THEN
       p_result := 'TRUE';
    ELSE
       p_result := 'FALSE';
    END IF; 

 RETURN p_result;

END User_Levels;​
于 2013-04-24T19:57:19.243 に答える