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,因此将其作为输出参数和返回值是多余的。你保留哪一个取决于你想如何使用它,但我建议一个函数在这里更灵活和合适。

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') 也是大写的。

此外,您不能从 SQL*PLUS 或任何命令提示符运行它,因为 v('APP_USER') 是应用程序变量;因此,您必须在 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 回答