我在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参数吗?
答案 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;