PL / SQL - 插入命令不在EXCEPTION块中执行

时间:2014-12-02 19:37:43

标签: sql oracle plsql

我在PL / SQL中有这个功能,我希望返回给定员工的工资。此外,我想在每次执行函数时在我创建的表中插入值。问题是函数在执行时插入值而没有错误,但在进入EXCEPTION块时不会插入。我在编译时没有遇到任何错误,它只是不执行插入。

CREATE OR REPLACE FUNCTION f(
    v_name employees.last_name%TYPE DEFAULT 'Bell')
  RETURN NUMBER
IS
  v_salary       employees.salary%type;
  v_user         my_info.user%type;
  v_data         my_info.data%type;
  v_command      my_info.command%type := 'f';
  v_no_lines     my_info.no_lines%type;
  v_error        my_info.error%type;
BEGIN
  SELECT USER INTO v_user FROM DUAL;
  SELECT SYSDATE INTO v_data FROM DUAL;
  SELECT SALARY INTO v_salary FROM employees WHERE last_name = v_name;
  v_no_lines := SQL%ROWCOUNT;
  INSERT INTO my_info VALUES(v_user, v_data, v_command, v_no_lines, 'No error'); 
  RETURN v_salary;

EXCEPTION
WHEN NO_DATA_FOUND THEN
    v_no_lines := SQL%ROWCOUNT;
    v_error := 'No employees with given name';
    INSERT INTO my_info VALUES(v_user, v_data, v_command, v_no_lines, v_error); --doesn't make the insert
    RAISE_APPLICATION_ERROR(-20000, 'No employees with given name');  
WHEN TOO_MANY_ROWS THEN 
    v_no_lines := SQL%ROWCOUNT;
    v_error := 'More than one employee with given name';
    INSERT INTO my_info VALUES(v_user, v_data, v_command, v_no_lines, v_error); --doesn't make the insert
    RAISE_APPLICATION_ERROR(-20001, 'More than one employee with given name');

WHEN OTHERS THEN
  RAISE_APPLICATION_ERROR(-20002,'Other error!');
END f;
/ 

稍后修改

我终于设法插入,但只有在我执行该函数之后。 我修改了函数并从中删除了所有插入并使其返回工资+受影响的行数

DECLARE
  v_user         my_info.user%type;
  v_data         my_info.data%type;
  v_command      my_info.command%type := 'f';
  v_no_lines     my_info.no_lines%type;
  v_error        my_info.error%type;
BEGIN 
  SELECT USER INTO v_user FROM DUAL;
  SELECT SYSDATE INTO v_data FROM DUAL;

  DBMS_OUTPUT.PUT_LINE(f('Bad Input', v_no_lines));
  v_error := 'No error';
  INSERT INTO my_info VALUES(v_user, v_data, v_command, v_no_lines, v_error);

  EXCEPTION
  WHEN OTHERS THEN
    v_no_lines := 0;
    v_error := SQLERRM;
    INSERT INTO my_info VALUES(v_user, v_data, v_command, v_no_lines, v_error);
END;
/

1 个答案:

答案 0 :(得分:0)

试试这种方式

DECLARE
  v_user         my_info.user%type;
  v_data         my_info.data%type;
  v_command      my_info.command%type := 'f';
  v_no_lines     my_info.no_lines%type;
  v_error        my_info.error%type;
  v_need_insert  number;
BEGIN
  begin
    v_need_insert := 0;
    SELECT USER INTO v_user FROM DUAL;
    SELECT SYSDATE INTO v_data FROM DUAL;

    DBMS_OUTPUT.PUT_LINE(f('Bad Input', v_no_lines));
    v_error := 'No error';
    INSERT INTO my_info VALUES(v_user, v_data, v_command, v_no_lines, v_error);

    EXCEPTION
    WHEN OTHERS THEN
      v_no_lines := 0;
      v_error := SQLERRM;
      v_need_insert := 1;
    END;
  IF v_need_insert = 1 THEN
    INSERT INTO my_info VALUES(v_user, v_data, v_command, v_no_lines, v_error);
  END IF;
END;