简答题1. Oracle JOB的分类是什么?
Oracle的JOB分为两类,DBMS_JOB和DBMS_SCHEDULER,二者都可以完成定时任务。(1)DBMS_JOB DBMS_JOB的SUBMIT过程参数如下:
其中,各个参数的说明如下:
1)参数JOB是由SUBMIT()过程返回的BINARY_INEGER。这个值用来唯一标识一个工作,此参数是个变量,在使用前需要被声明,JOB号在DBA_JOBS视图里可以查到。
2)WHAT参数的值是将被JOB执行的PL/SQL代码块,一般是存储过程的名字,记得存储过程后面一定要加上分号。
3)NEXT_DATE参数指示何时运行这个JOB,NEXT_DATE需要修改为数据库第一次执行该JOB的时间,SYSDATE表示立即执行。
4)INTERVAL参数表示这个JOB什么时候将被再次执行,指定JOB的运行周期,INTERVAL为空表示只执行一次。
5)NO_PARSE参数表示此JOB在提交或执行时是否应进行语法分析,TRUE代表此PL/SQL代码在它第一次执行时应进行语法分析,而FALSE代表本PL/SQL代码应立即进行语法分析,在创建JOB时进行检查。默认值为FALSE。
需要注意的是,NEXT_DATE是时间类型,INTERVAL是字符类型,在调用SUBMIT时要指定正确的参数类型。
(2)DBMS_SCHEDULER DBMS_SCHEDULER是Oracle 10g中新增的一个包,与老版本的DBMS_JOB包相比,DBMS_SCHEDULER有很多新特性。例如,DBMS_SCHEDULER可以执行存储过程、匿名块以及OS可执行文件和脚本(包括Linux系统的SHELL脚本),还可以使用DBMS_SCHEDULER更详细地定义JOB的各类属性。DBMS_SCHEDULER具有更详细的作业运行状态以及故障处理和报告功能。
从Oracle 10g开始,Oracle建议使用SCHEDULER替换普通的JOB来管理任务的执行。
下面的例子展示了如何创建一个DBMS_SCHEDULER类型的JOB:
2. RAC中如何指定JOB的运行实例?
在RAC中,可以让JOB在某个指定的实例上运行。对于DBMS_JOB和DBMS_SCHEDULER来说,它们的指定方法不同:
1)在DBMS_JOB下,执行SYS.DBMS_JOB.SUBMIT包创建JOB的时候,可以指定INSTANCE参数,该参数指定了JOB运行的实例。
2)DBMS_SCHEDULER下指定实例运行JOB稍微有点复杂,首先创建SERVICE,再创建JOB_CLASS,最后创建JOB才可以。
3. 如何判断SCHEDULER JOB是否正在运行?
可以查询DBA_SCHEDULER_JOBS视图的STATE列,若STATE列的值为RUNNING,则代表当前的JOB正在运行。或者通过查询视图DBA_SCHEDULER_RUNNING_JOBS,该视图中的JOB即正在运行的JOB。
4. 如何查询SCHEDULER JOB的运行日志?
可以通过查询视图DBA_SCHEDULER_JOB_RUN_DETAILS来获取SCHEDULER JOB的运行日志、产生的错误等信息。如下:
从查询结果中可以看到,JOB_INSERT_SQL_LHR从2016-11-29 13:03:36开始执行的时候就报错了,报错信息可以从ADDITIONAL_INFO列里找到,其报错的具体信息如下:
可见,涉及的程序是DB_MONITOR用户下的PKG_SQL_HISTORY_LHR包,而ORA-01658的错误是由于表空间不足引起的。
5. 通过DBMS_SCHEDULER如何调用SHELL脚本?
可以直接创建JOB来调用SHELL脚本,如下:
若是以普通用户执行上述代码的话,在执行过程中会遇到ORA-27486:insufficient privileges和ORA-27399:job type EXECUTABLE requires the CREATE EXTERNAL JOB privilege的错误,这是由于权限不足的缘故导致的。
解决方法:以SYSDBA连接,然后执行上述代码,或者用SYS用户进行赋权操作,这里假设普通用户的用户名为LHR:
赋权之后接着执行就好了:
6. 如何批量删除JOB?
可以采用SQL来生成删除JOB的语句,首先执行以下语句,可以根据情况对结果进行过滤:
将以上SQL生成的结果复制到命令窗口就可以批量执行了。
7. SQL*Plus中@和@@的区别是什么?
@和@@都可以调用脚本,它们的不同之处如下:
@等于start命令,用来运行一个SQL脚本文件。@命令调用当前目录下的,或指定全路径,或可以通过SQLPATH环境变量搜寻到的脚本文件。
@@用在脚本文件中,用来指定“@执行的脚本文件”与“@@执行的脚本文件”在同一目录,而不用指定全路径,也不从SOLPATH环境变量指定的路径中寻找文件,该命令一般用在嵌套脚本文件中。
8. SQL*Plus中&与&&的区别是什么?
&用来创建一个临时变量,每当遇到这个临时变量时,都会提示输入一个值。
&&用来创建一个持久变量,就像用DEFINE命令或带NEW_VLAuE子句的COLUMN命令创建的持久变量一样。当使用&&命令引用这个变量时,不会每次遇到该变量就提示用户键入值,而只有在第一次遇到时提示一次。
例如,将下面三行语句存为一个脚本文件,运行该脚本文件,会提示三次,让输入DEPTNOVAL的值:
将下面三行语句存为一个脚本文件,运行该脚本文件,则只会提示一次,让输入DEPTNOVAL的值:
9. glogin.sql脚本的作用是什么?
SQL*Plus在启动的时候会自动查找运行两个脚本文件:glogin.sql和login.sql。
login.sql文件可以存放SQL*Plus中能使用的任何命令。SQL*Plus在启动时会首先查找当前目录下的login.sql文件,其次会在SQLPATH目录下查找。如果找到login.sql文件,那么在SQL*Plus显示“SQL>”前执行login.sql里的所有内容。所以,可以将个人喜欢的常用设置放在login.sql文件中,每次SQL*Plus启动时会自动加载。
glogin.sql是SQL*Plus全局登录的配置文件,是Oracle自带的登录脚本文件,它的路径是固定的,即$ORACLE_HOME/sqlplus/admin。当用户启动SQL*Plus的时候,会从这个固定的路径加载glogin.sql。
可以在glogin.sql文件中添加如下的内容:
这样,每次登录SQL*Plus的时候,SQL提示符就会变为设置的内容,假设用户为SYS,数据库为lhrdb,则提示符如下:
注意,以上提示符的“>”后有一个空格。
10. SQL*Plus的ERRORLOGGING的作用是什么?
在Oracle 11g中,可以把SQL或PL/SQL错误信息自动记录到当前用户下的一个表中,而且不会自动删除,默认的表名为SPERRORLOG,也可以指定自己的表名替换默认表名。
11. 如何给SQL*Plus安装帮助?
SQL*Plus的帮助必须手工安装,shell脚本为$ORACLE_HOME/bin/helpins。在安装之前,必须先设置SYSTEM_PASS环境变量,如:
如果不设置该环境变量,那么将在运行脚本的时候提示输入环境变量。当然,除了shell脚本,还可以利用SQL脚本安装,那就不用设置环境变量了,但是,必须以SYSTEM登录。
在安装SQL*Plus的帮助功能之后,就可以像如下的方法使用帮助了:
需要注意的是,在Oracle 11g中,已经没有名称为“$ORACLE_HOME/bin/helpins”的shell脚本了,所以需要使用SQL脚本来安装。