我得到这个错误:PLS-00103:当期待下列之一时遇到符号“END”

时间:2016-01-17 18:14:08

标签: plsql

如果有人需要更多关于需要做什么程序或功能的信息,我很乐意解释它们。 这是我的包规范,其中我声明了函数和过程:

create or replace PACKAGE SEMIR AS 

  /* TODO enter package declarations (types, exceptions, methods etc) here */ 
  PROCEDURE set_sal;

  FUNCTION emp_info(empno NUMBER)
  return VARCHAR2;
END SEMIR;

和我的包裹身体:

create or replace PACKAGE BODY SEMIR AS




  PROCEDURE set_sal AS
  v_manager_sal number;
  v_sal number;
  v_grade number;
  v_empno number;
  BEGIN

    SELECT sal INTO v_sal FROM EMP1;
    SELECT grade INTO v_grade FROM EMP1;
    UPDATE EMP1
    SET oldsal = v_sal;
      IF (v_sal<=3000) THEN
      SELECT MAX(sal) INTO v_sal FROM EMP1
      WHERE grade = grade;

      SELECT sal into v_manager_sal FROM EMP1 WHERE job ='MANAGER' AND
       empno = mgr;
        IF(v_sal-100>v_manager_sal)
        THEN
        UPDATE EMP1
        SET sal = sal-(sal-100-v_sal);
        END IF;
      END IF;
  END set_sal;



  FUNCTION emp_info(empno NUMBER)
  return VARCHAR2 AS
  v_mgr number;
  BEGIN
  SELECT mgr INTO v_mgr
  FROM EMP1;
    IF (v_mgr IS NOT NULL)
    THEN
    SELECT mgr INTO empno
    FROM EMP1
    WHERE empno=mgr;
      IF (mgr IS NOT NULL)
      THEN
      SELECT mgr INTO empno
      FROM EMP1
      WHERE empno = mgr;

        RETURN 'EMPLOYEE:'|| ename || ',' || job;
        ELSE
        RETURN job;
        END IF;
      END IF;
  END emp_info;


END SEMIR;

我在包体中出错但我不知道出了什么问题。给我这个做的人也告诉我,这也可以使用游标完成,但我希望我能让这个工作。此致

2 个答案:

答案 0 :(得分:0)

我无法重现该错误,但我确实看到了这个错误:

Error: PLS-00403: expression 'EMPNO' cannot be used as an INTO-target of a SELECT/FETCH statement
Line: 41
Text: SELECT mgr INTO empno

这是因为尝试为IN参数赋值。 IN参数通过引用传递,不能修改。

  ...
  FUNCTION emp_info(empno NUMBER)   --Defaults to an IN parameter.
  return VARCHAR2 AS
  v_mgr number;
  BEGIN
  SELECT mgr INTO v_mgr
  FROM EMP1;
    IF (v_mgr IS NOT NULL)
    THEN
    SELECT mgr INTO empno           --Trying to modify the IN parameter.
  ...

答案 1 :(得分:0)

参数仅用作提供的值,您的要求将满足IN OUT模式参数。但建议不要在函数中使用out模式,因此最好使用除参数变量之外的其他变量。