我有一些SQL(选择/更新/插入)语法,我会一个接一个地在PL / SQL中运行
有没有办法检查每个语法是否正确完成,如果有一些错误它不会停止整个PL / SQL,它只会向变量返回“OK”或“Not OK”所以我可以使用它用IF?
更新
我想出了这个功能,但它似乎不起作用,它一直返回0!
create or replace
FUNCTION EXECUTE_SQL(
V_SQL IN VARCHAR2 )
RETURN NUMBER
AS
V_RESULTS NUMBER := 1;
BEGIN
BEGIN
EXECUTE IMMEDIATE V_SQL;
EXCEPTION
WHEN OTHERS THEN
-- the following line is just for debugging!
dbms_output.put_line(SQLERRM);
V_RESULTS:= 0;
END;
RETURN V_RESULTS;
END EXECUTE_SQL;
它有什么问题(如果有的话)! 欢呼声
答案 0 :(得分:4)
if sql%rowcount > 0 then
-- insert or update statement affected sql%rowcount rows
end if;
至于正确的语法:如果语法错误,它甚至不会编译。如果存在数据一致性错误(例如除以0错误或主键违规),则会引发异常。可以在exception handlers
中捕获此类异常在异常处理程序中,您可以检查sqlerrm以获取更多详细信息:
begin
update t set x = ...
exception when others then
dbms_output.put_line(SQLERRM);
end;
您还可以查看一些predefined exceptions:
begin
update t set x = ...
exception
when DUP_VAL_ON_INDEX
-- primary key or unique key violation
when OTHERS
-- other kind of exception
end;
答案 1 :(得分:2)
如果语法不正确,整个块将无效,因此您将无法运行它。
如果要运行所有语句,尽管可以引发异常,您可以:
BEGIN
BEGIN
statement1;
EXCEPTION
when exception1 then
some commands or null;
when exception2 then
some commands or null;
END;
BEGIN
statement2;
EXCEPTION
when exception3 then
some commands or null;
when exception4 then
some commands or null;
END;
etc.
END;
答案 2 :(得分:0)
撰写show errors
begin
update t set x = ...
exception
when DUP_VAL_ON_INDEX
-- primary key or unique key violation
when OTHERS
-- other kind of exception
end;
/
show errors
如果有的话会显示错误。