[英]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.