PL / SQL检查SQL执行是否正常?

时间:2012-03-27 12:11:51

标签: oracle plsql oracle11g

我有一些SQL(选择/更新/插入)语法,我会一个接一个地在PL / SQL中运行

有没有办法检查每个语法是否正确完成,如果有一些错误它不会停止整个PL / SQL,它只会向变量返回“O​​K”或“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;

它有什么问题(如果有的话)! 欢呼声

3 个答案:

答案 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

如果有的话会显示错误。