F_checksal不是过程,或者在编译plsql时未定义

F_checksal不是过程,或者在编译plsql时未定义,plsql,Plsql,当我试图编译此plsql时,我不断收到以下错误消息: 'F_checksal is not a procedure or is undefined' 代码如下: declare e_high_increase EXCEPTION; old_sal NUMBER; function f_checkSal(i_sal number,i_old_sal IN OUT NUMBER) return VARCHAR2 is begin if((i_sal/old_sal)*100&g

当我试图编译此plsql时,我不断收到以下错误消息:

'F_checksal is not a procedure or is undefined'
代码如下:

declare
  e_high_increase EXCEPTION;
  old_sal NUMBER;
  function f_checkSal(i_sal number,i_old_sal IN OUT NUMBER) return VARCHAR2 is
  begin
  if((i_sal/old_sal)*100>300) then
  raise e_high_increase;
  else  
  return 'yes';
  end if;
  exception when e_high_increase then
  insert into t_logerror(error_tx) values ('this is user exception');
  dbms_output.put_line('this is user exception');
  return 'No';
  end;
begin
select sal into old_sal FROM emp where empno=153;
f_checksal(30000,old_sal);
update emp set sal=30000 where empno=153;  
end;

你的语法太离谱了。您需要首先创建函数,然后在pl/sql块中引用它:

步骤1:

CREATE OR REPLACE FUNCTION f_checksal (i_sal NUMBER, i_old_sal IN OUT NUMBER)
   RETURN VARCHAR2
IS
   old_sal           NUMBER;
   e_high_increase   EXCEPTION;
BEGIN
   IF ((i_sal / old_sal) * 100 > 300)
   THEN
      RAISE e_high_increase;
   ELSE
      RETURN 'yes';
   END IF;
EXCEPTION
   WHEN e_high_increase
   THEN
      INSERT INTO t_logerror
                  (error_tx
                  )
           VALUES ('this is user exception'
                  );

      DBMS_OUTPUT.put_line ('this is user exception');
      RETURN 'No';
END;
/
步骤2:

DECLARE
   old_sal   NUMBER;
   RESULT    VARCHAR2 (100);
BEGIN
   SELECT sal
     INTO old_sal
     FROM emp
    WHERE empno = 153;

   RESULT := f_checksal (30000, old_sal);

   UPDATE emp
      SET sal = 30000
    WHERE empno = 153;
END;

请注意,您的函数有一个返回值,您没有在调用代码中指定该值。

需要更改的只是您对函数的调用


您可以通过调用过程(例如,
DBMS\u OUTPUT.put\u line(f\u checksal(30000,old\u sal));
)使用结果,或者将其分配给局部变量,例如,
result:=f\u checksal(30000,old\u sal)

这是脚本文件吗?不能创建这样的函数。您必须单独创建函数,然后从SQL脚本调用。@OldProgrammer,在匿名块中声明函数当然是可能的。语法不是“太离谱”。在块中使用函数不需要创建函数。只有在需要从SQL调用函数时,才需要将其创建为单独的模式对象。