




全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Oracle专题PL/SQL调试一般方法在开发PL/SQL程序时,每个程序错误都有其特殊之处,这就使得程序的调试和测试技术面临挑战。虽然在开发过程中可以借助于测试来减少程序错误的数量,但是,如果能有效的调试PL/SQL程序,可以较大幅度提高开发效率及质量。以下为PL/SQL调试的一些方法:(1) 捕捉违例通过两个内建的函数sqlcode 和sqlerrm 来找出发生了哪类错误并获得详细的错误信息,在内部违例发生时,sqlcode返回从-1至20000之间的一个错误号,但有一个例外,仅当内部违例no_data_found 发生时,才会返回一个正数 100。当用户自定义的违例发生时,sqlcode返回1,除非用户使用 pragma exception_init 将自定义违例绑定一个自定义的错误号。当没有违例抛出时,sqlcode返回0。下面是个简单的捕捉违例的例子:CREATE OR REPLACE PROCEDURE PROC_GETEXCEPTIONINFO(I_TMPVAR IN NUMBER,O_RETCODE OUT VARCHAR2,O_ERRMSG OUT VARCHAR2) ISV_TMPVAR NUMBER;BEGINSELECT I_TMPVAR / 0 INTO V_TMPVAR FROM DUAL;EXCEPTIONWHEN OTHERS THENO_RETCODE := SQLCODE;O_ERRMSG := SQLERRM;END PROC_GETEXCEPTIONINFO;运行结果为:输入:I_TMPVAR 10输出:O_RETCODE -1476O_ERRMSG ORA-01476: 除数为 0(2) 将结果打印到屏幕通过DBMS_OUTPUT包将PLSQL中的变量值打印到屏幕上,在程序运行过程中,可以跟踪变量的变化轨迹。DECLAREBEGINDBMS_OUTPUT.PUT_LINE(Before loop.);FOR V_COUNTER IN 1 . 5 LOOPDBMS_OUTPUT.PUT_LINE(Inside loop. counter= | V_COUNTER);END LOOP;DBMS_OUTPUT.PUT_LINE(After loop.);END;运行结果为:Before loop.Inside loop. counter=1Inside loop. counter=2Inside loop. counter=3Inside loop. counter=4Inside loop. counter=5After loop.(3) 使用调试表把变量的值插入到程序维持的临时表中,当该程序运行结束时,查询该临时表中的变量数据值。这种调试方法实现起来最容易并且不需特定的运行环境,只需在程序中插入INSERT语句。DECLAREBEGIN FOR i IN 1.100 LOOPINSERT INTO TMP_TAB VALUES(CURRVAL:+i);END LOOP;COMMIT;END;(4) 写日志文件上面的方法能在开发阶段对编写和调试存储过程提供最大限度的方便,但为了在系统测试或生产环境中确认我们的代码是否正常工作时,就需要记录日志。PLSQL提供了一个utl_file包,通过定义utl_file包中的file_type类型,能获得一个文件句柄,通过此句柄能实现一般的文件操作功能。默认的数据库参数是不允许使用utl_file包的,需要手动进行设置,使用GUI的管理工具或手工编辑init.ora文件,找到 utl_file_dir 参数,如果没有,则添加一行,修改成如下(注意等号左右不要留空格,可能会引起解析错误,导致设置无效):utl_file_dir=/usr/tmp 或 utl_file_dir=*第一种方式限定了在utl_file包中能存取的目录,第二种方式则不进行限定。无论哪种方式,都要确保运行数据库实例的用户,拥有此目录的存取权限,否则在使用包的过程中会报出错误信息。DECLAREfi utl_file.file_type;BEGIN fi := utl_file.fopen(/usr/tmp,tmp.log, a );FOR V_COUNTER IN 1 . 5 LOOPutl_file.put_line( fi, V_COUNTER= | V_COUNTER);END LOOP; EXCEPTION WHEN OTHERS THENIF( utl_file.is_open( fi ) THEN utl_file.put_line( fi, error: );utl_file.put_line( fi, SQLCODE= | SQLCODE );utl_file.put_line( fi, SQLERRM= | SQLERRM );utl_file.new_line( fi, 1 );utl_file.fflush( fi );utl_file.fclose( fi );END IF;raise_application_error( -20001, sqlcode | | | sqlerrm );END;(5) 条件编译在开发PL/SQL程序期间,会经常使用调式命令,在这些代码实际应用前,这些调试语句必须被删除或禁用,PL/SQL缺少许多程序语言中所带的条件编译,但在Oracle 10g使得开发人员能够在原来的位置保留这些调试命令,从而便于在产生问题时能重新恢复这些命令。 有了条件编译,就能进入只有在编译期间才会执行的if-then控制结构,它的目的是使用if-then控制结构来控制程序编译时所包含的文本语句(从THEN或ELSE子句中)。条件编译控制结构通过标准if-then块的关键字(IF, THEN, ELSE, ELSEIF, END)前的条件编译触发器字符($)来进行标识(除了END代替END IF作为块的结束符的情况以外)。Oracle PL/SQL编译器对源代码进行初始扫描以查找条件编译触发器字符$。如果能找到任何有效的触发器字符,编译器就将计算编译条件以确定在实际编译的代码中包含哪些代码文本。 条件编译使用选择指令(selection directive)或查询指令(inquiry directive)来确定在编译程序中包含哪些文本。下面为选择指令(selection directive)的例子:CREATE OR REPLACE PACKAGE BODY worker_pkg asPROCEDURE run_prc isBEGINdbms_output.put_line(Processing started.);$if debug_pkg.debug $then dbms_output.put_line(Debugging is on.); $enddbms_output.put_line(Processing completed.);END;END worker_pkg;/当静态常量debug_pkg.debug设置为FALSE,则当worker_pkg包自动地重新编译时不会包含$then后面的DBMS_OUTPUT语句。为了确定已经编译过的准确代码,Oracle提供了DBMS_PREPROCESSOR包可以查询编译后的结果:dbms_preprocessor.print_post_processed_source(PACKAGE BODY,USER,WORKER_PKG);输出结果为:PACKAGE BODY worker_pkg asPROCEDURE run_prc isBEGINdbms_output.put_line(Processing started.);dbms_output.put_line(Processing completed.);END;END worker_pkg;条件编译的查询指令能够通过以下预定义的指令名称将测试条件依赖于编译环境。 任何Oracle PL/SQL的编译初始参数,例如PLSQL_CCFLAGS、PLSQL _CODE _TYPE或PLSQL_WARNING。 来自PLSQL_LINE的模块行号。 来自PLSQL_UNIT的当前源单位名称,注意这个指令名称将为异步模块返回NULL。 由PLSQL_CCFLAGS引入的自定义名称-值对。本例将通过PLSQL_CCFLAGS初始参数构建自定义的名称-值对。alter session set PLSQL_CCFLAGS = MyDebugMode:TRUE;接下来修改测试过程以使用查询指令。CREATE OR REPLACE PACKAGE BODY worker_pkg asPROCEDURE run_prc isBEGINdbms_output.put_line(Processing started.);$if $MyDebugMode $thendbms_output.put_line(Debugging is on.);$enddbms_output.put_line(Processing completed.);END;END worker_pkg;测试这个过程来说明预期的结果:set serverout on;exec worker_pkg.run_prc;Processing started.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年移动互联网应用开发考试试题及答案
- 2025年数据科学与大数据技术课程考试试卷及答案
- 2025年农村经济管理师资格考试试卷及答案
- 2025年美术教师专业技能考试试题及答案
- 2025年教育科技在课堂应用能力考核试卷及答案
- 2025年教师资格证考试卷及答案
- 2025年非洲文化与贸易研究生入学考试试卷及答案
- 2025年高层管理人员沟通技巧考核试题及答案
- 正规煤炭运输合同
- 2024年度浙江省护师类之主管护师自我检测试卷B卷附答案
- 金融公司干股协议书
- 2025益阳事业单位笔试真题
- 2025年初中地理学业水平考试(八年级)模拟卷【内蒙古专用】(含解析)
- 2025年江苏南京河西新城区国有资产经营控股集团招聘笔试参考题库含答案解析
- 《足外伤的护理》课件
- 大一信息技术考试试题及答案
- 泵站沉井施工方案
- 职业技术学院2024级药膳与食疗专业人才培养方案
- 固化地面承揽合同协议
- 2025物业社区文化建设方案物业社区文化活动方案2
- 高端写字楼安全管理
评论
0/150
提交评论