还有一个也想问一下:在SQL*Plus中用@*.sql执行脚本,如果有错直接退出,在log文件中只有执行成功还是失败的记录,同样没有打印哪条语句失败的打印,请问有无方法让其打印出错语句,以便用spool输出?谢谢!

解决方案 »

  1.   

    0.打开你指定的log文件(开始为空)、打开*sql文件;
    1.用程序判断一个分号(;)算作一条语句;
    2.show error;
    3.判断有无错误,若有写入此log文件中(行号、错误信息),
      若无,什么也不写。
    4.循环1-3;
    5.最后关闭上log文件。
      

  2.   

    不太明白,执行期的代码不用show err的。
      

  3.   

    谢谢各位,主要很关心有比下面没有更好的方案或做法,谢谢:
    “由于需要定位到出错语句,因此准备采用按行读入脚本的方法,即程序读完一行判断是不是一段语句结束,如果是就发给Oracle服务器等待回应,如有错误就提示出错信息和正要执行的读入的内容。这样做麻烦的是要程序判断哪些语句是一个逻辑段,哪些是注释等等,很不放心这样的判断是否准确,而在SQL*Plus中直接是@*.sql,就不用考虑这么多。”
      

  4.   

    如果脚本的逻辑比较复杂的,一条一条读进来再执行是不太容易的,比如loop或者if什么的就不大好办了。调大脚本有这样一种方法:
    1建一个表,用于保存跟踪信息,如当前执行的位置,变量的名字和值,时间等等。
    2写一个存储过程用于接受参数,向上面的表中插入记录,注意这个存储过程要加上PRAGMA AUTONOMOUS_TRANSACTION;这样这个存储过程的提交或回退不影响调用者的transaction
    3在要调试的脚本中的关键点上调用上面的存储过程,把执行位置、变量值等内容写到跟踪用的表中
    这样,不管是否报ORALCE错,都可以了解脚本的逻辑是否正确
      

  5.   

    1.首先读脚本,然后执行还是可行的,尤其脚本是自己编写的格式一般不会太花哨,判断是否一个完整的逻辑块,和区分注释还是有办法的,我以前就写过一个这样的工具,当时是用PB,主要是因为用SQL*PLUS执行时,不论创建成功还是失败,都没有对象的名称,定位问题很不方便。2.如果想在SQL*PLUS中执行脚本,又希望能够得到执行的详细信息,可以修改脚本,在每个逻辑段前用DBMS_OUTPUT.PUT_LINE()输出对象信息,就可以知道哪些语句执行成功,哪些失败了。