异常不适用于oracle中的执行立即插入
我在执行立即插入语句异常部分遇到了一些问题 我有一个表查询\u tb,它包含两列DEPT和SOURCE\u VALUE 该列包含以下中的数据 办事员 推销员异常不适用于oracle中的执行立即插入,oracle,plsql,Oracle,Plsql,我在执行立即插入语句异常部分遇到了一些问题 我有一个表查询\u tb,它包含两列DEPT和SOURCE\u VALUE 该列包含以下中的数据 办事员 推销员 select e.empno,e.ename,e.job,d.deptno,d.dname,d.loc from emp e,dept d where e.deptno=d.deptno and e.empno= '#V_GCIF#' 经理 select a.empno,a.ename,a.job,b.deptn
select e.empno,e.ename,e.job,d.deptno,d.dname,d.loc from emp e,dept
d where e.deptno=d.deptno and e.empno= '#V_GCIF#'
经理
select a.empno,a.ename,a.job,b.deptno,b.dname,b.loc from employee
a,department b where a.deptno=b.deptno and a.empno= '#V_GCIF#'
管理员
如果我通过了emp表上保留的正确empno,它将正常运行。但如果我传递了错误的empno no data,则异常部分不工作
create or replace
PROCEDURE test_emp_sp(
p_id IN VARCHAR2)
AS
CURSOR rec
IS
SELECT dept,
source_value
FROM query_tb;
v_query VARCHAR2(1000);
BEGIN
FOR rec IN
(SELECT dept,source_value FROM query_tb
)
LOOP
IF rec.dept='CLERK' THEN
v_query :=REPLACE(rec.source_value,'#V_GCIF#',p_id);
EXECUTE IMMEDIATE 'INSERT INTO emp_tb (empno,ename,job,mgr,hiredate,deptno,dname,loc) ('||v_query|| ')';
dbms_output.put_line(v_query||' inserted');
ELSE
v_query:=REPLACE(rec.source_value,'#V_GCIF#',p_id);
EXECUTE IMMEDIATE 'INSERT INTO emp_tb (empno,ename,job,deptno,dname,loc) ('||v_query||')';
dbms_output.put_line(v_query||' inserting others');
END IF;
END LOOP;
commit;
EXCEPTION
WHEN others THEN
dbms_output.put_line('No data Found...');
END;
异常不起作用,因为没有异常。 如果SELECT返回NULL,则将插入0行。 例如: 结果:插入0行。插入到。。。从…中选择。。 不会引发“未找到数据”异常。它将只插入0条记录 要测试是否插入了任何记录,可以在insert语句之后使用SQL%ROWCOUNT
execute immedate 'INSERT...;
if SQL%ROWCOUNT=0
then
dbms_output.put_line('no records inserted');
else
...
end if;
也可以考虑将VY-GCIF转换成可绑定的变量,如:pII.
您可以跳过replace语句并将execute immediate更改为以下内容:execute immediate 'INSERT INTO ...'||v_query
using p_id;
DECLARE
customException EXCEPTION;
PRAGMA EXCEPTION_INIT( customException, -20001 );
....
BEGIN
EXECUTE IMMEDIATE 'INSERT INTO emp_tb (empno,ename,job,mgr,hiredate,deptno,dname,loc)
('||v_query|| ')';
IF (SQL%ROWCOUNT) = 0 then
raise_application_error( -20001, 'This is a custom error' );
end if;
EXCEPTION
WHEN customException THEN
dbms_output.put_line('No data Found...');
END;
这将把p_id的值绑定到语句中的:p_id。这是因为您没有运行select命令,它是一个insert命令insert select,这意味着如果select不返回行,它就不会插入任何内容,并且不会为此引发错误。您应该检查insert命令是否影响了任何行。在Oracle中执行此操作的方法是在执行后立即检查SQL%ROWCOUNT,如果它变为0,则执行引发异常的工作。可能是这样的:
execute immedate 'INSERT...;
if SQL%ROWCOUNT=0
then
dbms_output.put_line('no records inserted');
else
...
end if;
execute immediate 'INSERT INTO ...'||v_query
using p_id;
DECLARE
customException EXCEPTION;
PRAGMA EXCEPTION_INIT( customException, -20001 );
....
BEGIN
EXECUTE IMMEDIATE 'INSERT INTO emp_tb (empno,ename,job,mgr,hiredate,deptno,dname,loc)
('||v_query|| ')';
IF (SQL%ROWCOUNT) = 0 then
raise_application_error( -20001, 'This is a custom error' );
end if;
EXCEPTION
WHEN customException THEN
dbms_output.put_line('No data Found...');
END;
很长一段时间没有在Oracle PLSql中编程,因此提供的代码中的某些内容可能无法编译,但这些内容都在那里。在internet上查看这些内容,您会感觉很好。这里最基本的事情是适当地捕获错误,以便能够跟踪。这里我放置了日志记录器和异常处理程序jsut来检查错误。我还提出了一个加薪申请错误。在snipet中也做了一些修改。希望能有帮助 PS:我没有检查语法,因为我现在没有工作区
现在,如果我想添加绑定变量,我被清除了。以下查询v_query中出现了一些错误:=REPLACErec.source_值,'v_GCIF',':p_id';使用p|U id执行立即“插入emp|U tb empno、ename、job、mgr、hiredate、deptno、dname、loc”命令-错误ora-01006 bind变量不存在…请在替换后的v_查询上添加一个dbms_输出,以便我们可以查看它是如何成为最终sql字符串的。如果其他人使用,则dbms_输出。。。没有加薪真的是很糟糕的编程实践。当其他人那么dbms_输出。。。没有加薪是非常糟糕的编程实践。异常处理程序将导致此代码忽略任何和所有异常。
CREATE OR REPLACE
PROCEDURE test_emp_sp(
p_id IN VARCHAR2)
AS
--Not needed
-- CURSOR rec
-- IS
-- SELECT dept,
-- source_value
-- FROM query_tb;
--Not needed
v_query VARCHAR2(1000);
BEGIN
FOR rec IN
(SELECT dept,source_value FROM query_tb
)
LOOP
IF rec.dept='CLERK' THEN
v_query :=REPLACE(rec.source_value,'#V_GCIF#',p_id);
BEGIN
EXECUTE IMMEDIATE 'INSERT INTO emp_tb (empno,ename,job,mgr,hiredate,deptno,dname,loc) ('||v_query|| ')';
dbms_output.put_line(v_query||' inserted');
EXCEPTION WHEN OTHERS THEN
dbms_output.put_line(' Error while inserting data in emp_tab for Clerk--> '||SQLCODE||'---'||SQLERRM);
END;
ELSE
v_query:=REPLACE(rec.source_value,'#V_GCIF#',p_id);
BEGIN
EXECUTE IMMEDIATE 'INSERT INTO emp_tb (empno,ename,job,deptno,dname,loc) ('||v_query||')';
dbms_output.put_line(v_query||' inserting others');
EXCEPTION WHEN OTHERS THEN
dbms_output.put_line(' Error while inserting data in emp_tab for other then clerk --> '||SQLCODE||'---'||SQLERRM);
END;
END IF;
END LOOP;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20001,'Error occurred in the plsql block',TRUE);
END;
/