PL SQL函数 - 如何调用

时间:2013-04-24 18:14:20

标签: sql function parameters plsql oracle-apex

我在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。

我真的需要名为result的OUT参数吗?

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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;​