Oracle PL/SQLINSERT忽略语句

Oracle PL/SQLINSERT忽略语句,oracle,plsql,cursor,oracle-sqldeveloper,sql-function,Oracle,Plsql,Cursor,Oracle Sqldeveloper,Sql Function,我要做的是在表“info”中插入不同的内容,具体取决于选择结果:如果是一行、无行或多行。 我想在exception部分设置outretvalue变量,然后根据outretvalue在IF部分进行插入。 无论如何,我在编译时遇到一个错误,说f2函数处于无效状态。我有两个错误:插入错误和无法识别行数错误。为什么? CREATE OR REPLACE FUNCTION f2 (v_nume employees.last_name%TYPE DEFAULT 'Bell') RETURN NUMBER

我要做的是在表“info”中插入不同的内容,具体取决于选择结果:如果是一行、无行或多行。 我想在exception部分设置outretvalue变量,然后根据outretvalue在IF部分进行插入。 无论如何,我在编译时遇到一个错误,说f2函数处于无效状态。我有两个错误:插入错误和无法识别行数错误。为什么?

CREATE OR REPLACE FUNCTION f2 (v_nume employees.last_name%TYPE DEFAULT 'Bell') 
RETURN NUMBER 
IS 
  salariu employees.salary%type; 
  outretvalue number(2) := 0;
BEGIN 
  SELECT salary 
  INTO salariu 
  FROM employees 
  WHERE last_name = v_nume; 
  RETURN salariu; 
  EXCEPTION
  WHEN NO_DATA_FOUND THEN
    outretvalue := 1;

  WHEN TOO_MANY_ROWS THEN
--at this row I have 2 errors: for the INSERT and for not recognising rowcount
    INSERT INTO info(`no_lines`) VALUES(SQL%ROWCOUNT);

END f2; 
/
SELECT f2('King') FROM dual;

Oracle将编译错误保存在表中。我使用以下查询检索存储过程/函数中的PL/SQL错误:

SELECT '*** ERROR in ' || TYPE || ' "' || NAME || '", line ' || LINE || ', position ' || POSITION || ': ' || TEXT
  FROM SYS.USER_ERRORS
您可以尝试运行它,看看它是否有助于识别函数中的错误。

您的函数:

DECLARE
BEGIN
END;
   ... something
END;
在“开始”处添加另一个“开始”,或在现有“开始-结束”块内移动“开始-结束”并删除第二个“结束”

编辑:澄清后

CREATE OR REPLACE FUNCTION f2 (v_nume employees.last_name%TYPE DEFAULT 'Bell') 
RETURN NUMBER 
IS 
  salariu     employees.salary%type; 
  outretvalue number(2) := 0;
BEGIN 
  SELECT salary 
    INTO salariu 
    FROM employees 
   WHERE last_name = v_nume; 
  RETURN salariu; 
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    RETURN -1;
  WHEN TOO_MANY_ROWS THEN
    SELECT count(*)
      INTO salariu
      FROM employees 
     WHERE last_name = v_nume; 
    INSERT INTO info(no_lines) VALUES(salariu);
    RETURN -2;
  WHEN OTHERS THEN
    RETURN -3;
END f2; 
/

SET SERVEROUTPUT on

DECLARE
  l_ret  NUMBER;
BEGIN
  dbms_output.put_line(f2('Bell'));
  dbms_output.put_line(f2('noBell'));
  dbms_output.put_line(f2('King'));
END;

遇到符号“IF”我已删除异常块和IF块之间的结束使用WHEN others部分中的SELECT count(*)。但是您应该将INSERT移到太多行的部分,否则它将永远不会执行,因为您有两行代码outretvalue:=3,如果outretvalue=2。谢谢,但它甚至没有到达那里。由于我的输入,将有太多的行,outretvalue将为2。这就是它进入IF语句并在INSERT时抛出错误的原因(出于未知原因),还有一个原因:如果您进入任何异常部分,函数将结束而不返回。这是个错误。因此,要根据行数执行插入,我必须完全不使用异常?
Try this. It will definelty help you out.

CREATE OR REPLACE FUNCTION f2(
    v_nume employees.last_name%TYPE DEFAULT 'Bell')
  RETURN NUMBER
IS
  salariu employees.salary%type;
  outretvalue NUMBER(2) := 0;
  lv_cnt PLS_INTEGER;
BEGIN
  SELECT salary INTO salariu FROM employees WHERE last_name = v_nume;
  RETURN salariu;
EXCEPTION
WHEN NO_DATA_FOUND THEN
  outretvalue := 1;
WHEN TOO_MANY_ROWS THEN
  SELECT COUNT(1) INTO lv_cnt FROM employees WHERE last_name = v_nume;
  INSERT INTO info
    ( no_lines
    ) VALUES
    ( lv_cnt
    );
    RETURN 2;
WHEN OTHERS THEN
RETURN 3;
END f2;