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