以下程序符合罚款,
CREATE PROCEDURE PROCEDURE1
(v_MGR int,
v_empid IN OUT int)
AS
BEGIN
v_empid :=0;
IF (v_mgr IS NOT NULL AND v_mgr <> '') then
EXECUTE IMMEDIATE 'SELECT EMPNO
FROM EMP
WHERE MGR = Rtrim(v_MGR)' into v_empid;
END IF;
END PROCEDURE1;
但是当我跑步时
DECLARE
V_MGR NUMBER;
V_EMPID NUMBER;
BEGIN
V_MGR := 7902;
V_EMPID := NULL;
PROCEDURE1(
V_MGR => V_MGR,
V_EMPID => V_EMPID
);
DBMS_OUTPUT.PUT_LINE('V_EMPID = ' || V_EMPID);
END;
输出应为v_empid = 2356
但它始终显示v_empid = 0请帮助获得正确答案
答案 0 :(得分:5)
为什么out
参数为0?请查看过程中的if
条件
IF (v_mgr IS NOT NULL AND v_mgr <> '')
尤其是在其第二部分AND v_mgr <> ''
。 Oracle将空字符串''
视为null
,与null
的任何比较都会导致未知结果,因此上述IF
条件总是计算为false,因此execute immediate
语句从不执行v_empid
的值
永远不会被覆盖。
在这种特殊情况下,绝对不需要使用动态SQL(本机动态sql execute immediate
),因为没有动态构造查询 - 表和列在编译时是已知的。您只需使用静态SQL:
如果您的查询返回多行,则会遇到too_many_rows
异常。您应该保证您的查询只返回一行,方法是在查询的rownum=1
子句中包含where
(如果更改了多行),或者使用集合作为{{ 1}}参数,返回结果集:
out
答案 1 :(得分:1)
嗯,您宣布v_MGR int
,然后您去测试v_mgr <> ''
并在您的情况下使用此Rtrim(v_MGR)
。
是什么,(var)char或mgr和v_mgr的数字?
答案 2 :(得分:0)
试试这个
CREATE PROCEDURE PROCEDURE1
(v_MGR int,
v_empid IN OUT int)
AS
BEGIN
v_empid :=0;
IF (v_mgr IS NOT NULL AND v_mgr <> '') then
SELECT EMPNO into v_empid
FROM EMP
WHERE MGR = Rtrim(v_MGR) ;
END IF;
END PROCEDURE1;