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