如何使用dbms lob.substr

如何使用DBMS_SCHEDULER管理计划任务JOB_数据库技术_Linux公社-Linux系统门户网站
你好,游客
如何使用DBMS_SCHEDULER管理计划任务JOB
来源:Linux社区&
作者:mikixiyou
在 数据库中,执行计划任务的工具通常都是DBMS_JOB 包。这个包使用简单,历史悠久,目前还在广泛使用中。坦率地讲,这个包的功能满足了绝大部分应用的计划任务运行需要,所以生命力才这么强。
但是,我们这里还是要说一下它的不足之处。
在DBMS_JOB 使用中,我们需要知道每一次JOB 执行的时间,用于判断该JOB 调用的存储过程执行时间。这里你会说,这个在存储过程里也可以实现的,在存储过程中,执行前后加个时间戳记录到日志表中就可以实现。
是的。以前我们在处理这类需求时也是这么做的。
但从ORACLE 10.1 版本开始,ORACLE 开发了一个新的包DBMS_SCHEDULER 。这个包挺复杂的,以至于我在初次学习之后,就没再去用它了。功能太强大了,其实很多我们不需要的。
我们就有这个需求,看看DBMS_SCHEDULER 是如何解决的。
在SQLPLUS 中,使用DBMS_SCHEDULER.CREATE_JOB 创建计划任务,用于调度一个存储过程。
存储过程很简单,我为这个测试而创建的,就是向一张表里插入数据。
CREATE TABLE T1 AS SELECT SYSDATE AS AA FROM DUAL;
CREATE OR REPLACE PROCEDURE SP_TEST_T1 AS
INSERT INTO T1 SELECTD SYSDATE FROM DUAL;
这个存储过程没有输入输出参数,是为了JOB 调用方便。如果实际运行过程中有参数,我们就写一个存储过程封装它,再放入JOB 中调用。
CREATE PROCEDURE GATHER_GTJA_STATS
SYS.DBMS_STATS.GATHER_SCHEMA_STATS(OWNNAME =& 'GTJA',ESTIMATE_PERCENT =& 30,METHOD_OPT =& 'FOR ALL INDEXED COLUMNS SIZE AUTO',CASCADE =& TRUE,OPTIONS =& 'GATHER');
使用DBMS_SCHEDULER.CREATE_JOB 创建一个JOB, 调用存储过程SP_TEST_T1 ,执行间隔2 分钟。这里的JOB_NAME 名称可以自己定义,这个摆脱了DBMS_JOB 中JOB 号不能自定义的缺点。
EXEC DBMS_SCHEDULER.CREATE_JOB(JOB_NAME =& 'JOB_SP_TEST_T1',JOB_TYPE =& 'STORED_PROCEDURE',JOB_ACTION =&'SP_TEST_T1' ,START_DATE =& SYSDATE ,REPEAT_INTERVAL =& 'FREQ=MINUTELY; INTERVAL=2');
该命令执行成功后,可以在*_SCHEDULER_JOBS 中看到JOB 的配置值。
SELECT * FROM DBA_SCHEDULER_JOBS;
SELECT * FROM USER_SCHEDULER_JOBS WHERE JOB_NAME='JOB_SP_TEST_T1';
使用该命令新建的JOB ,默认是不执行的,需要将其状态改成可执行状态。
EXEC DBMS_SCHEDULER.ENABLE(NAME =& 'JOB_SP_TEST_T1');
可以删除重建它。
EXEC DBMS_SCHEDULER.DROP_JOB(JOB_NAME =& 'JOB_SP_TEST_T1');
EXEC DBMS_SCHEDULER.CREATE_JOB(JOB_NAME =& 'JOB_SP_TEST_T1',JOB_TYPE =& 'STORED_PROCEDURE',JOB_ACTION =& 'SP_TEST_T1',START_DATE =& TO_DATE(' 15:30:00','YYYY-MM-DD HH24:MI:SS') ,REPEAT_INTERVAL =& 'FREQ=DAILY');
这个创建过程而言,其实和DBMS_JOB 创建JOB 的差别不大,但DBMS_SCHEDULER 可配置的地方就太多了。执行时间间隔非常非常灵活,这里不做详述了,具体请看ORACLE 官方文档。
DBMS_SCHEDULER 针对每一次JOB 执行,都做了详细记录,因此,可以查询到每一次JOB 执行的时间了。
具体可以查看两类视图*_SCHEDULER_JOB_LOG 和*_SCHEDULER_JOB_RUN_DETAILS 。
SELECT * FROM DBA_SCHEDULER_JOB_LOG;
SELECT * FROM DBA_SCHEDULER_JOB_RUN_DETAILS;
如果嫌日志太多了,可以使用PURGE_LOG 去清理。
EXECUTE DBMS_SCHEDULER.PURGE_LOG;
这个DBMS_SCHEDULER 包的功能太多了,用起来也累,所以很多人还是选择DBMS_JOB 。
看到关于这两个包的不同点的介绍,摘录下来,留着参考。
At first glance it looks like only other names with more human readable schedules fordbms_scheduler , compared to&dbms_job . When looking slightly better, there are loads of differences, even in Oracle 10gR1. Currently we are in 11gR2. Every release&dbms_scheduler &gets more enhancements, where&dbms_job &has been static for many years.
Differences
dbms_scheduler has logging
dbms_scheduler has external jobs
dbms_scheduler has job chains
dbms_scheduler has job event handling (can raise and react upon events)
dbms_scheduler has&resource manager &integration
dbms_scheduler has human readable calendar syntax
dbms_scheduler can combine different calendars in a new one
In 11g extra
dbms_scheduler has remote external jobs
dbms_scheduler has light weight jobs - generate many low overhead jobs in one tx
dbms_scheduler can send mail on job completion
dbms_scheduler jobs can have multiple targets
dbms_job can only run pl/sql type of jobs in the current database.
I hope this (in complete list) h
相关资讯 & & &
& (02/02/:26)
& (10/29/:24)
& (10/10/:40)
& (11/14/:10)
& (06/16/:23)
图片资讯 & & &
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款dbms 用java编写的 ,实现了建表,删除,插入 交差,投影 选取等功能 Develop 238万源代码下载-
&文件名称: dbms
& & & & &&]
&&所属分类:
&&开发工具: Java
&&文件大小: 72 KB
&&上传时间:
&&下载次数: 93
&&提 供 者:
&详细说明:用java编写的dbms,实现了建表,删除,插入,并交差,投影连接选取等功能-Using java prepared dbms, the realization of the built form, delete, insert, and has done its job, the projector to connect to select features such as
文件列表(日期:~)(点击判断是否您需要的文件,如果是垃圾请在下面评价投诉):
&&db新版&&......\c.txt&&......\CreatBox.class&&......\db$1.class&&......\db.class&&......\db2$1.class&&......\db2.class&&......\dbs.class&&......\dbs.java&&......\index.class&&......\object.class&&......\s1&&......\sc.txt&&......\SQL_Dialog_denglu$1.class&&......\SQL_Dialog_denglu$2.class&&......\SQL_Dialog_denglu.class&&......\stu.txt&&......\student.txt&&......\
&近期下载过的用户:
&相关搜索:
&输入关键字,在本站238万海量源码库中尽情搜索:
&[] - java 简单模拟DBMS功能,添加删除表,属性,记录
&[] - 一个用java编写的从底层开始设计的小型数据库管理系统,供学习用。
&[] - 数据库管理系统的课程设计,Java语言实现的一个DBMS,包括完整的设计文档和源码以及可执行程序。
&[] - 模拟数据库系统的各种功能,添加删除一行,显示数据字典等
&[] - B+树实现源码,JAVA语言,数据库索引技术
&[] - 这是一个用C编写的小型数据库系统,实现了数据库,实现了表的定义,查找,插入,删除,索引等数据库操作。是一个数据库原型。
&[] - MinisQL的源码,是用C++写的,仅供参加
&[] - Java连接Oracle数据库实例 实现SQL*PLUS功能 带JDBC驱动 适合初学者学习参考
&[] - 一个使用C++写的命令行界面的DBMS,支持最基本的SQL语句,功能类似Oracle的sqlplus
&[] - 一个功能齐全的自制数据库系统,输入sql语言可进行建表,插入,查询,删除等功能~[转载]DBMS_SQL的使用 [转载]
[转载]DBMS_SQL的使用 [转载]
0:49:00来源:
DBMS_SQL的使用?------- 通常运用DBMS_SQL包一般分为几步: 1. open cursor: 打开cursor 2. parse cursor:解析你要执行的SQL语句 3. bind variable:如果要执行的SQL语句中包含变量,在此就需要绑定变量 4. execute:执行SQL语句 5. close cursor:在执行后关闭此cursor. 如果你还需要返回执行SQL的结果集,还需要使用define_column,define_array等方法。 -------?下面根据不同情况进行详细展示: 在做展示之前,先准备一些基础数据 create table demo (a number,b number,c number); begin for i in 1 .. 15 loop insert into demo values (round(dbms_random.value, 2) * 100, round(dbms_random.value, 2) * 100, round(dbms_random.value, 2) * 100);基础数据完成之后,下面开始对一些具体情况进行分析.1.执行一般的select语句首先先介绍最常用情况:CREATE OR REPLACE PROCEDURE define_column(no IN NUMBER) IS cursor_name INTEGER := dbms_sql.open_ --在初始化参数时,就可以打开 row_process INTEGER; v_b NUMBER; BEGIN --解析要执行的SQL. dbms_sql.parse(cursor_name, 'select * from demo where a= :no', dbms_sql.native); --如果要执行的SQL中不需要参数,则可以省略掉bind_variable dbms_sql.bind_variable(cursor_name, 'no', no); --如果需要返回查询语句的结果,则必须在exec之前使用define_column函数定义返回字段; --define_column函数的第一个参数是最初定义的cursor name, --第二个参数是指需要返回的字段在查询结果中处于第几列,在此例中返回的字段是查询结果中的第二列,即b列; --第三个参数就是接收返回结果需要的变量 dbms_sql.define_column(cursor_name, 2, v_b); --必须定义一个参数接收exec的结果 row_process := dbms_sql.EXECUTE(cursor_name); LOOP IF dbms_sql.fetch_rows(cursor_name) & 0 THEN --将前面定义的字段返回给变量v_b-- dbms_sql.column_value(cursor_name, 2, v_b); dbms_output.put_line('B is ' || v_b); ELSE EXIT; END IF; END LOOP; --数据处理完成后记得要将cursor关闭 dbms_sql.close_cursor(cursor_name); EXCEPTION WHEN OTHERS THEN dbms_sql.close_cursor(cursor_name); END;?2.使用define_array方法得到查询结果 前面已经分析了如何使用define_column方法得到查询结果,但有时我们想要一次得到多行查询结果,此时我们就需要使用define_array方法, 此方法常用于DML操作,稍后会有例子对此介绍,现在先来看一下如果使用define_array.?CREATE OR REPLACE PROCEDURE define_array IS c NUMBER; d NUMBER; --DBMS_SQL.NUMBER_TABLE类型实际就是type NUMBER_TABLE is table of number index by binary_ n_tab DBMS_SQL.NUMBER_TABLE; n_tab1 DBMS_SQL.NUMBER_TABLE; indx NUMBER := 1; BEGIN c := DBMS_SQL.OPEN_CURSOR; DBMS_SQL.PARSE(c, 'select * from demo where rownum&13 order by 1', DBMS_SQL.NATIVE); --在此需要特别介绍一下define_array函数的第一个参数是已经打开的cursor名称, --第二个参数是指需要返回的字段在查询结果中处于第几列, --第三个参数就是接收返回结果需要的变量,与define_column不同的是此变量是 table,而不是普通的字段类型; --第四个参数表示一次可以返回的行数;第五个参数是指n_tab的index从哪个数值开始,此数值是递增的.在此例中 index是从1开始的, --一次得到9行结果集,则有n_tab(1)到n_tab(9),如果循环再得到新的结果集,则index继续增长 n_tab(10).... DBMS_SQL.DEFINE_ARRAY(c, 1, n_tab, 9, indx); DBMS_SQL.DEFINE_ARRAY(c, 2, n_tab1, 9, indx); d := DBMS_SQL.EXECUTE(c); LOOP d := DBMS_SQL.FETCH_ROWS(c); dbms_output.put_line('fetch rows is ' || d); EXIT WHEN d & 9; DBMS_SQL.COLUMN_VALUE(c, 1, n_tab); DBMS_SQL.COLUMN_VALUE(c, 2, n_tab1); FOR i IN 1 .. d LOOP dbms_output.put_line(n_tab(i) || ',' || n_tab1(i)); END LOOP; END LOOP; DBMS_SQL.CLOSE_CURSOR(c); EXCEPTION WHEN OTHERS THEN IF DBMS_SQL.IS_OPEN(c) THEN DBMS_SQL.CLOSE_CURSOR(c); END IF; END;?3.使用variable_value显示DML后的返回结果(单条记录) 以上我们介绍了如何使用DBMS_SQL包来处理数据查询,如果我们把查询语句更换成DML语句,则可以完成各种DML操作。 在PL/SQL中我们可以使用returning方法返回DML操作结果,在DBMS_SQL</s
(SQL)比较一个 (SQL)比较一个集合是否在另一个集合里存在的方法使用dbms_sql程序包的用户需要什么权限?
[问题点数:50分,结帖人mydb]
使用dbms_sql程序包的用户需要什么权限?
[问题点数:50分,结帖人mydb]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
本帖子已过去太久远了,不再提供回复功能。

我要回帖

更多关于 dbms lob.substr 的文章

 

随机推荐