簡體   English   中英

PL / SQL-插入命令不在EXCEPTION塊中執行

[英]PL/SQL - Insert command doesn't execute in EXCEPTION block

我在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;
/

嘗試這種方式

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM