oracle存储过程无法正常工作

时间:2013-10-04 20:29:08

标签: oracle stored-procedures

以下程序符合罚款,

 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请帮助获得正确答案

3 个答案:

答案 0 :(得分:5)

  1. 为什么out参数为0?请查看过程中的if条件

    IF (v_mgr IS NOT NULL AND v_mgr <> '')
    

    尤其是在其第二部分AND v_mgr <> ''。 Oracle将空字符串''视为null,与null的任何比较都会导致未知结果,因此上述IF条件总是计算为false,因此execute immediate语句从不执行v_empid的值 永远不会被覆盖。

  2. 在这种特殊情况下,绝对不需要使用动态SQL(本机动态sql execute immediate),因为没有动态构造查询 - 表和列在编译时是已知的。您只需使用静态SQL:

  3. 如果您的查询返回多行,则会遇到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;