题目部分
如何在Oracle中写操作系统文件,如写日志?
答案部分
可以利用UTL_FILE包,但是,在此之前,要注意设置好UTL_FILE_DIR初始化参数。
其它常见问题如下表所示:
问题 | 答案 |
---|---|
Oracle中哪个包可以获取环境变量的值? | 可以通过DBMS_SYSTEM.GET_ENV来获取环境变量的当前生效值。 |
如何让程序等待60秒钟后继续运行? | 可以执行$ORACLE_HOME/rdbms/admin/dbmslock.sql来创建DBMS_LOCK包,该包可以实现让程序暂时等待的功能。若想普通用户使用该包,则需要在SYS用户下执行“GRANT EXECUTE ON DBMS_LOCK TO USER_XXX;”命令。 |
Oracle使用哪个包可以生成并传递数据库告警信息? | DBMS_ALERT包用于生成并传递数据库告警信息。若想使用DBMS_ALERT包,则必须以SYS登陆,为普通用户授予执行权限。DBMS_ALERT能让数据库触发器在特定的数据库值发生变化时向应用程序发送报警。报警是基于事务的并且是异步的(也就是它们的操作与定时机制无关)。 |
程序包DBMS_APPLICATION_INFO.READ_MODULE的作用是什么? | DBMS_APPLICATION_INFO是一个非常有用的程序包,它提供了通过V$SESSION跟踪脚本运行情况的能力,该包可以填充V$SESSION中的CLIENT_INFO、MODULE和ACTION这3列的值。在CLIENT_INFO列中存放程序的客户端信息;MODULE列存放主程序名,如包的名称;ACTION列存放程序包中的过程名。该包不仅提供了设置这些列值的过程,还提供了返回这些列值的过程。主要有如下的存储过程:l lDBMS_APPLICATION_INFO.SET_CLIENT_INFO:填充V$SESSION视图的CLIENT_INFO列,记录客户端的信息,这里可以记录客户端的IP地址l lDBMS_APPLICATION_INFO.SET_MODULE:填充V$SESSION视图的MODULE列,记录主程序名l lDBMS_APPLICATION_INFO.READ_CLIENT_INFO:从V$SESSION中读取客户端的信息l lDBMS_APPLICATION_INFO.READ_MODULE:从V$SESSION中读取主程序的名称 |
如何填充V$SESSION的CLIENT_INFO列和CLIENT_IDENTIFIER列? | V$SESSION的CLIENT_INFO列和CLIENT_IDENTIFIER列往往为空,所以需要写登录触发器,然后在触发器中使用如下的存储过程记录这2列的值: BEGIN DBMS_APPLICATION_INFO.SET_CLIENT_INFO(SYS_CONTEXT('USERENV','IP_ADDRESS')); DBMS_SESSION.SET_IDENTIFIER(SYS_CONTEXT('USERENV', 'HOST')); EXCEPTION WHEN OTHERS THEN ROLLBACK; END; |
如何将信息写入Oracle的告警日志中? | 使用系统存储过程“SYS.DBMS_SYSTEM.KSDWRT(2,V_MESSAGE)”可将信息写入Oracle的告警日志。如下:SYS@orclasm > EXEC SYS.DBMS_SYSTEM.KSDWRT(2,'this is a test');PL/SQL procedure successfully completed.查看告警日志:Sat Mar 18 18:30:27 2017this is a test |
在Oracle中,如何获取IP地址? | 若是获取服务器IP地址,则使用UTL_INADDR.GET_HOST_ADDRESS。若是获取客户端IP地址则使用SYS_CONTEXT('USERENV','IP_ADDRESS')。 |
如何在存储过程中暂停指定时间? | DBMS_LOCK包的SLEEP过程。例如:“DBMS_LOCK.SLEEP(5);”表示暂停5秒。 |
DBMS_OUTPUT提示缓冲区不够,怎么增加? | 采用命令“DBMS_OUTPUT.ENABLE(20000);”,另外,如果DBMS_OUTPUT的信息不能显示,那么需要设置SET SERVEROUTPUT ON。 |
如何在Oracle中写操作系统文件,如写日志? | 可以利用UTL_FILE包,但是,在此之前,要注意设置好UTL_FILE_DIR初始化参数。 |
当DML语句中有一条数据报错时,如何让该DML语句继续执行? | 当一个DML语句运行的时候,如果遇到了错误,那么这条语句会进行回滚,就好像没有执行过。对于一个大的DML语句而言,如果个别数据错误而导致整个语句的回滚,那么会浪费很多的资源和运行时间。所以,从Oracle 10g开始Oracle支持记录DML语句的错误,而允许语句自动继续执行。这个功能可以使用DBMS_ERRLOG包实现。 |
本文选自《Oracle程序员面试笔试宝典》,作者:李华荣。