- 浏览: 495903 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (301)
- Swing技术 (1)
- Linux (1)
- Javascript (22)
- 数据结构和算法 (3)
- J2SE (36)
- workflow (5)
- 设计模式 (14)
- web service (19)
- Ajax (14)
- 中间件 & 服务器 (8)
- 多线程 (9)
- Oracle (52)
- sys & soft (10)
- JMS (3)
- sso (9)
- android (11)
- struts2 (10)
- web协议 (2)
- 分布式 (2)
- PM (2)
- OLAP (3)
- Redis (2)
- Hibernate (7)
- ibatis (2)
- SQLServer (1)
- maven (3)
- Spring (7)
- Jsp (2)
- slf4j (1)
- jQuery (15)
- 权限 (1)
- 系统集成 (1)
- 笔记 (1)
- Freemarker (2)
- 项目管理 (1)
- eclipse (3)
- GIS (1)
- NoSql (3)
- win10 (1)
- win10网络 (2)
- 底层 (3)
- 数据库 (0)
最新评论
-
kabuto_v:
请问那种图,uml图是怎么画出来的呢?是您自己手工画的,还是有 ...
FastJSON 序列化、反序列化实现 -
梦行Monxin商城系统:
电商实例、业务并发、网站并发及解决方法 -
rockethj8:
client 㓟有一个参数是可以忽略一些URL 不进行验证登录 ...
SSO 之 (单点登录)实施中遇到的几个问题 -
mengxiangfeiyan:
好啊。。。。。
Oracle删除表,删除数据以及恢复数据、利用现有表创建新表
http://www.cnblogs.com/conqueror/archive/2010/10/10/1847088.html
在项目中,经常会遇到需要定时完成的任务,比如定时更新数据,定义统计数据生成报表等等,其实这些事情都可以使用Oracle的Job来完成。下面考试大就结合我们实验室项目实际,简单介绍一下在Oracle数据库中通过Job完成自动创建表的方法。
整个过程总共分为两步。虽然整个过程都非常简单,但是对于初学Oracle的生手还是有很多地方需要注意的。
首先介绍一下,创建该JOB的背景,因为每天更新的直播和点播节目信息比较多,为了方便处理,需要每天创建一张表来记录更新的节目信息,当前数据库中已经有一张tbl_programme的表,每天创建的表的字段需要同tbl_programme保持一致,每天新创建的表的名称格式为tbl_programme_日期(例如:tbl_programme_20090214)规定每天晚上1点钟生成该天的新表。
第一步:创建一个执行创建操作的存储过程
在这一步首先要解决的问题就是构造表名。在Oracle中格式话输出时间可以用to_char函数来处理,例如:
SQL> select to_char(sysdate, ’yyyy/mm/dd hh24:mi:ss’) from dual;
TO_CHAR(SYSDATE,’YYYY/MM/DDHH2
------------------------------
2009/02/14 17:22:41
以上SQL格式化输出了时间,要得到我们所需要的格式直接修改一下SQL即可
SQL> select to_char(sysdate, ’yyyymmdd’) from dual;
TO_CHAR(SYSDATE,’YYYYMMDD’)
---------------------------
20090214
得到时间格式字符串后我们就可以将表名的前缀和时间连接在一起形成完整的表名。这里需要注意,在Oracle中链接两个字符串需要使用‘||’符号,而在Sql Server中直接使用‘+’号就可以了,因为我以前一直在Sql Server下编程,好久都没编写Oracle的SQL所以费了很大的功夫才发现这个问题。完整的Sql就是
SQL> select ’tbl_programme_’ || to_char(sysdate, ’yyyymmdd’) from dual;
’TBL_PROGRAMME_’||TO_CHAR(SYSD
------------------------------
tbl_programme_20090214
接下来就是创建表的代码了,因为新表需要tbl_programme保持一致,所以直接CTAS来创建表那是非常适合的了,代码如下:
Create table tablename as select * from tbl_programme
如果需要指定一个TableSpace则将该SQL做适当修改:
Create table tablename tablespace p2p as select * from tbl_programme
所以整个创建存储过程的SQL就是
create or replace procedure sp_createtab_tbl_programme
Authid Current_User
as
tabname varchar(200);
begin
select ’TBL_PROGRAMME_’ || to_char(sysdate, ’yyyymmdd’) into tabname from dual;
--create table tabname as select * from tbl_programme where 1 != 1;
execute immediate ’create table ’ || tabname ||’ tablespace p2p as select * from tbl_programme where 1 != 1’;
commit;
end;
/
这里还需要注意一下在Oracle里面如果要对一个变量赋值的话有两种方式:
(1) 使用:=进行赋值
(2) 使用select ‘xjkxj ’ into 变量名称 from tabname
另外,在存储过程中定义变量的时候一般放在as/is后begin前面。在存储过程一般是不能直接使用create table,truncate table这类似的语句的,如果要使用这些语句必须使用excute immediate + 所要执行的sql语句来实现。
注意上面用红色标志的语句:Authid Current_User
这个语句比较重要,如果我们在创建存储过程的时候不添加这条语句执行该存储过程将不会成功,原因是默认情况向存储过程是没有Create table等权限的,即使当前用户有DBA的权限也不行,如果存储过程中存在创建表的操作,可以有以下两种方式来解决该问题。
(1) 显示的赋予该用户Create table的权限,grant create table to user.
(2) 在存储过程中使用Authid Current_User 标识使用当前用户的权限。
第二步:创建JOB
创建JOB就比较简单了,下面就是创建JOB的代码
每天晚上1电job启动一次,执行sp_createtab_tbl_programme存储过程。
VARIABLE testjobid number;
begin
sys.dbms_job.submit(:testjobid,’sp_createtab_tbl_programme;’,trunc(sysdate+1)+1/24,’trunc(sysdate+1)+1/24’);
commit;
end;
/
这里需要注意的是,在submit方法的前面一定要先定义job这个变量,另外,submit方法的第二个参数是一个存储过程的名,记得在后面添加“:”号,在next_date是一个时间类型变量而不是一个字符串,所以需要注意不要把它当成字符串,不需要对该参数加引号。最后一个参数interval是一个字符串类型,记得添加引号。最常见的错误如下图所示:
ORA-01008: not all variables bound就是没有定义变量的意思。一定记的在使用submit方法时定义jobid变量。
下面是常有的设置Interval的方法:
2 每天固定时间运行,比如早上8:10分钟:Trunc(Sysdate+1) + 8/24
² 每天:trunc(sysdate+1)
² 每周:trunc(sysdate+7)
² 每月:trunc(sysdate+30)
² 每个星期日:next_day(trunc(sysdate),’SUNDAY’)
² 每天6点:trunc(sysdate+1)+6/24
² 半个小时:sysdate+30/1440
需要用到的完整SQL如下:
-----------------------------------------------------
-- Export file for user P2P --
-- Created by Administrator on 2009-2-14, 15:45:18 --
-----------------------------------------------------
spool gjgdp2p(v1.3).log
promptprompt Creating procedure SP_CREATETAB_TBL_PROGRAMME
prompt =============================================
prompt
create or replace procedure sp_createtab_tbl_programme
Authid Current_User
as
tabname varchar(200);
begin
select ’TBL_PROGRAMME_’ || to_char(sysdate, ’yyyymmdd’) into tabname from dual;
--create table tabname as select * from tbl_programme where 1 != 1;
execute immediate ’create table ’ || tabname ||’ tablespace p2p as select * from tbl_programme where 1 != 1’;
commit;
end;
/
VARIABLE testjobid number;
begin
sys.dbms_job.submit(:testjobid,’sp_createtab_tbl_programme;’,trunc(sysdate+1)+1/24,’trunc(sysdate+1)+1/24’);
commit;
end;
/
spool off
第三步:异常情况处理
JOB不能运行情况处理
1.先来了解一下JOB的参数说明:与job相关的参数一个是job_queue_processes,这个是运行JOB时候所起的进程数,当然系统里面JOB大于这个数值后,就会有排队等候的,最小值是0,表示不运行JOB,最大值是36,在OS上对应的进程时SNPn,9i以后OS上管理JOB的进程叫CJQn.可以使用下面这个SQL确定目前有几个SNP/CJQ在运行。
select * from v$bgprocess,这个paddr不为空的snp/cjq进程就是目前空闲的进程,有的表示正在工作的进程。
另外一个是job_queue_interval,范围在1——3600之间,单位是秒,这个是唤醒JOB的process,因为每次snp运行完他就休息了,需要定期唤醒他,这个值不能太小,太小会影响数据库的性能。
2.诊断:先确定上面这两个参数设置是否正确,特别是第一个参数,设置为0了,所有JOB就不会跑,确认无误后,我们继续向下。
3.使用下面的SQL察看JOB的的broken,last_date和next_date,last_date是指最近一次job运行成功的结束时间,next_date是根据设置的频率计算的下次执行时间,根据这个信息就可以判断JOB上次是否正常,还可以判断下次的时间对不对,SQL如下:
select * from dba_jobs
有时候我们发现他的next_date是4000年1月1日,说明job要不就是在running,要不就是状态是break(broken=Y),如果发现JOB的broken值为Y,找用户了解一下,确定该JOB是否可以broken,如果不能broken,那就把broken值修改成N,修改再使用上面的SQL察看就发现他的last_date已经变了,JOB即可正常运行,修改broken状态的SQL如下:
declare
BEGIN
DBMS_JOB.BROKEN(<JOB_ID>,FALSE);
END;
4.使用下面的SQL查询是否JOB还在Running
select * from dba_jobs_running
如果发现JOB已经Run了很久了还没有结束,就要查原因了。一般的JOB running时会锁定相关的相关的资源,可以查看一下v$access和v$locked_object这两个view,如果发现其他进程锁定了与JOB相关的Object,包括PKG/Function/Procedure/Table等资源,那么就要把其他进程删除,有必要的话,把JOB的进程也删除,再重新跑看看结果。
5.如果上面都正常,但是JOB还不run,怎么办?那我们要考虑把JOB进程重启一次,防止是SNP进程死了造成JOB不跑,指令如下:
alter system set job_queue_processes=0 ——关闭job进程,等待5——10秒钟
alter system set job_quene_processes=5 ——恢复原来的值
附录:Oracle存储过程基本语法
1.基本结构
CREATE OR REPLACE PROCEDURE 存储过程名字
(
参数1 IN NUMBER,
参数2 IN NUMBER
) IS
变量1 INTEGER :=0;
变量2 DATE;
BEGIN
END 存储过程名字
2.SELECT INTO STATEMENT
将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条
记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND)
例子:
BEGIN
SELECT col1,col2 into 变量1,变量2 FROM typestruct where xxx;
EXCEPTION
WHEN NO_DATA_FOUND THEN
xxxx;
END;
...
3.IF 判断
IF V_TEST=1 THEN
BEGIN
do something
END;
END IF;
4.while 循环
WHILE V_TEST=1 LOOP
BEGIN
XXXX
END;
END LOOP;
5.变量赋值
V_TEST := 123;
6.用for in 使用cursor
...
IS
CURSOR cur IS SELECT * FROM xxx;
BEGIN
FOR cur_result in cur LOOP
BEGIN
V_SUM :=cur_result.列名1+cur_result.列名2
END;
END LOOP;
END;
7.带参数的cursor
CURSOR C_USER(C_ID NUMBER) IS SELECT NAME FROM USER WHERE TYPEID=C_ID;
OPEN C_USER(变量值);
LOOP
FETCH C_USER INTO V_NAME;
EXIT FETCH C_USER%NOTFOUND;
do something
END LOOP;
CLOSE C_USER;
8.用pl/sql developer debug
连接数据库后建立一个Test WINDOW
在窗口输入调用SP的代码,F9开始debug,CTRL+N单步调试
通过一个实际的例子学习Oracle存储过程
——创建存储过程
CREATE OR REPLACE PROCEDURE xxxxxxxxxxx_p
(
--参数IN表示输入参数,OUT表示输入参数,类型可以使用任意Oracle中的合法类型。
is_ym IN CHAR
)
AS
--定义变量
vs_msg VARCHAR2(4000); --错误信息变量
vs_ym_beg CHAR(6); --起始月份
vs_ym_end CHAR(6); --终止月份
vs_ym_sn_beg CHAR(6); --同期起始月份
vs_ym_sn_end CHAR(6); --同期终止月份
--定义游标(简单的说就是一个可以遍历的结果集)
CURSOR cur_1 IS
SELECT area_code,CMCODE,SUM(rmb_amt)/10000 rmb_amt_sn,SUM(usd_amt)/10000 usd_amt_sn
FROM BGD_AREA_CM_M_BASE_T
WHERE ym >= vs_ym_sn_beg
AND ym <= vs_ym_sn_end
GROUP BY area_code,CMCODE;
BEGIN
--用输入参数给变量赋初值,用到了Oralce的SUBSTR TO_CHAR ADD_MONTHS TO_DATE 等很常用的函数。
vs_ym_beg := SUBSTR(is_ym,1,6);
vs_ym_end := SUBSTR(is_ym,7,6);
vs_ym_sn_beg := TO_CHAR(ADD_MONTHS(TO_DATE(vs_ym_beg,’yyyymm’), -12),’yyyymm’);
vs_ym_sn_end := TO_CHAR(ADD_MONTHS(TO_DATE(vs_ym_end,’yyyymm’), -12),’yyyymm’);
--先删除表中特定条件的数据。
DELETE FROM xxxxxxxxxxx_T WHERE ym = is_ym;
--然后用内置的DBMS_OUTPUT对象的put_line方法打印出影响的记录行数,其中用到一个系统变量SQL%rowcount
DBMS_OUTPUT.put_line(’del上月记录=’||SQL%rowcount||’条’);
INSERT INTO xxxxxxxxxxx_T(area_code,ym,CMCODE,rmb_amt,usd_amt)
SELECT area_code,is_ym,CMCODE,SUM(rmb_amt)/10000,SUM(usd_amt)/10000
FROM BGD_AREA_CM_M_BASE_T
WHERE ym >= vs_ym_beg
AND ym <= vs_ym_end
GROUP BY area_code,CMCODE;
DBMS_OUTPUT.put_line(’ins当月记录=’||SQL%rowcount||’条’);
--遍历游标处理后更新到表。遍历游标有几种方法,用for语句是其中比较直观的一种。
FOR rec IN cur_1 LOOP
UPDATE xxxxxxxxxxx_T
SET rmb_amt_sn = rec.rmb_amt_sn,usd_amt_sn = rec.usd_amt_sn
WHERE area_code = rec.area_code
AND CMCODE = rec.CMCODE
AND ym = is_ym;
END LOOP;
COMMIT;
--错误处理部分。OTHERS表示除了声明外的任意错误。SQLERRM是系统内置变量保存了当前错误的详细信息。
EXCEPTION
WHEN OTHERS THEN
vs_msg := ’ERROR IN xxxxxxxxxxx_p(’||is_ym||’):’||SUBSTR(SQLERRM,1,500);
ROLLBACK;
--把当前错误记录进日志表。
INSERT INTO LOG_INFO(proc_name,error_info,op_date)
VALUES(’xxxxxxxxxxx_p’,vs_msg,SYSDATE);
COMMIT;
RETURN;
END;
在项目中,经常会遇到需要定时完成的任务,比如定时更新数据,定义统计数据生成报表等等,其实这些事情都可以使用Oracle的Job来完成。下面考试大就结合我们实验室项目实际,简单介绍一下在Oracle数据库中通过Job完成自动创建表的方法。
整个过程总共分为两步。虽然整个过程都非常简单,但是对于初学Oracle的生手还是有很多地方需要注意的。
首先介绍一下,创建该JOB的背景,因为每天更新的直播和点播节目信息比较多,为了方便处理,需要每天创建一张表来记录更新的节目信息,当前数据库中已经有一张tbl_programme的表,每天创建的表的字段需要同tbl_programme保持一致,每天新创建的表的名称格式为tbl_programme_日期(例如:tbl_programme_20090214)规定每天晚上1点钟生成该天的新表。
第一步:创建一个执行创建操作的存储过程
在这一步首先要解决的问题就是构造表名。在Oracle中格式话输出时间可以用to_char函数来处理,例如:
SQL> select to_char(sysdate, ’yyyy/mm/dd hh24:mi:ss’) from dual;
TO_CHAR(SYSDATE,’YYYY/MM/DDHH2
------------------------------
2009/02/14 17:22:41
以上SQL格式化输出了时间,要得到我们所需要的格式直接修改一下SQL即可
SQL> select to_char(sysdate, ’yyyymmdd’) from dual;
TO_CHAR(SYSDATE,’YYYYMMDD’)
---------------------------
20090214
得到时间格式字符串后我们就可以将表名的前缀和时间连接在一起形成完整的表名。这里需要注意,在Oracle中链接两个字符串需要使用‘||’符号,而在Sql Server中直接使用‘+’号就可以了,因为我以前一直在Sql Server下编程,好久都没编写Oracle的SQL所以费了很大的功夫才发现这个问题。完整的Sql就是
SQL> select ’tbl_programme_’ || to_char(sysdate, ’yyyymmdd’) from dual;
’TBL_PROGRAMME_’||TO_CHAR(SYSD
------------------------------
tbl_programme_20090214
接下来就是创建表的代码了,因为新表需要tbl_programme保持一致,所以直接CTAS来创建表那是非常适合的了,代码如下:
Create table tablename as select * from tbl_programme
如果需要指定一个TableSpace则将该SQL做适当修改:
Create table tablename tablespace p2p as select * from tbl_programme
所以整个创建存储过程的SQL就是
create or replace procedure sp_createtab_tbl_programme
Authid Current_User
as
tabname varchar(200);
begin
select ’TBL_PROGRAMME_’ || to_char(sysdate, ’yyyymmdd’) into tabname from dual;
--create table tabname as select * from tbl_programme where 1 != 1;
execute immediate ’create table ’ || tabname ||’ tablespace p2p as select * from tbl_programme where 1 != 1’;
commit;
end;
/
这里还需要注意一下在Oracle里面如果要对一个变量赋值的话有两种方式:
(1) 使用:=进行赋值
(2) 使用select ‘xjkxj ’ into 变量名称 from tabname
另外,在存储过程中定义变量的时候一般放在as/is后begin前面。在存储过程一般是不能直接使用create table,truncate table这类似的语句的,如果要使用这些语句必须使用excute immediate + 所要执行的sql语句来实现。
注意上面用红色标志的语句:Authid Current_User
这个语句比较重要,如果我们在创建存储过程的时候不添加这条语句执行该存储过程将不会成功,原因是默认情况向存储过程是没有Create table等权限的,即使当前用户有DBA的权限也不行,如果存储过程中存在创建表的操作,可以有以下两种方式来解决该问题。
(1) 显示的赋予该用户Create table的权限,grant create table to user.
(2) 在存储过程中使用Authid Current_User 标识使用当前用户的权限。
第二步:创建JOB
创建JOB就比较简单了,下面就是创建JOB的代码
每天晚上1电job启动一次,执行sp_createtab_tbl_programme存储过程。
VARIABLE testjobid number;
begin
sys.dbms_job.submit(:testjobid,’sp_createtab_tbl_programme;’,trunc(sysdate+1)+1/24,’trunc(sysdate+1)+1/24’);
commit;
end;
/
这里需要注意的是,在submit方法的前面一定要先定义job这个变量,另外,submit方法的第二个参数是一个存储过程的名,记得在后面添加“:”号,在next_date是一个时间类型变量而不是一个字符串,所以需要注意不要把它当成字符串,不需要对该参数加引号。最后一个参数interval是一个字符串类型,记得添加引号。最常见的错误如下图所示:
ORA-01008: not all variables bound就是没有定义变量的意思。一定记的在使用submit方法时定义jobid变量。
下面是常有的设置Interval的方法:
2 每天固定时间运行,比如早上8:10分钟:Trunc(Sysdate+1) + 8/24
² 每天:trunc(sysdate+1)
² 每周:trunc(sysdate+7)
² 每月:trunc(sysdate+30)
² 每个星期日:next_day(trunc(sysdate),’SUNDAY’)
² 每天6点:trunc(sysdate+1)+6/24
² 半个小时:sysdate+30/1440
需要用到的完整SQL如下:
-----------------------------------------------------
-- Export file for user P2P --
-- Created by Administrator on 2009-2-14, 15:45:18 --
-----------------------------------------------------
spool gjgdp2p(v1.3).log
promptprompt Creating procedure SP_CREATETAB_TBL_PROGRAMME
prompt =============================================
prompt
create or replace procedure sp_createtab_tbl_programme
Authid Current_User
as
tabname varchar(200);
begin
select ’TBL_PROGRAMME_’ || to_char(sysdate, ’yyyymmdd’) into tabname from dual;
--create table tabname as select * from tbl_programme where 1 != 1;
execute immediate ’create table ’ || tabname ||’ tablespace p2p as select * from tbl_programme where 1 != 1’;
commit;
end;
/
VARIABLE testjobid number;
begin
sys.dbms_job.submit(:testjobid,’sp_createtab_tbl_programme;’,trunc(sysdate+1)+1/24,’trunc(sysdate+1)+1/24’);
commit;
end;
/
spool off
第三步:异常情况处理
JOB不能运行情况处理
1.先来了解一下JOB的参数说明:与job相关的参数一个是job_queue_processes,这个是运行JOB时候所起的进程数,当然系统里面JOB大于这个数值后,就会有排队等候的,最小值是0,表示不运行JOB,最大值是36,在OS上对应的进程时SNPn,9i以后OS上管理JOB的进程叫CJQn.可以使用下面这个SQL确定目前有几个SNP/CJQ在运行。
select * from v$bgprocess,这个paddr不为空的snp/cjq进程就是目前空闲的进程,有的表示正在工作的进程。
另外一个是job_queue_interval,范围在1——3600之间,单位是秒,这个是唤醒JOB的process,因为每次snp运行完他就休息了,需要定期唤醒他,这个值不能太小,太小会影响数据库的性能。
2.诊断:先确定上面这两个参数设置是否正确,特别是第一个参数,设置为0了,所有JOB就不会跑,确认无误后,我们继续向下。
3.使用下面的SQL察看JOB的的broken,last_date和next_date,last_date是指最近一次job运行成功的结束时间,next_date是根据设置的频率计算的下次执行时间,根据这个信息就可以判断JOB上次是否正常,还可以判断下次的时间对不对,SQL如下:
select * from dba_jobs
有时候我们发现他的next_date是4000年1月1日,说明job要不就是在running,要不就是状态是break(broken=Y),如果发现JOB的broken值为Y,找用户了解一下,确定该JOB是否可以broken,如果不能broken,那就把broken值修改成N,修改再使用上面的SQL察看就发现他的last_date已经变了,JOB即可正常运行,修改broken状态的SQL如下:
declare
BEGIN
DBMS_JOB.BROKEN(<JOB_ID>,FALSE);
END;
4.使用下面的SQL查询是否JOB还在Running
select * from dba_jobs_running
如果发现JOB已经Run了很久了还没有结束,就要查原因了。一般的JOB running时会锁定相关的相关的资源,可以查看一下v$access和v$locked_object这两个view,如果发现其他进程锁定了与JOB相关的Object,包括PKG/Function/Procedure/Table等资源,那么就要把其他进程删除,有必要的话,把JOB的进程也删除,再重新跑看看结果。
5.如果上面都正常,但是JOB还不run,怎么办?那我们要考虑把JOB进程重启一次,防止是SNP进程死了造成JOB不跑,指令如下:
alter system set job_queue_processes=0 ——关闭job进程,等待5——10秒钟
alter system set job_quene_processes=5 ——恢复原来的值
附录:Oracle存储过程基本语法
1.基本结构
CREATE OR REPLACE PROCEDURE 存储过程名字
(
参数1 IN NUMBER,
参数2 IN NUMBER
) IS
变量1 INTEGER :=0;
变量2 DATE;
BEGIN
END 存储过程名字
2.SELECT INTO STATEMENT
将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条
记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND)
例子:
BEGIN
SELECT col1,col2 into 变量1,变量2 FROM typestruct where xxx;
EXCEPTION
WHEN NO_DATA_FOUND THEN
xxxx;
END;
...
3.IF 判断
IF V_TEST=1 THEN
BEGIN
do something
END;
END IF;
4.while 循环
WHILE V_TEST=1 LOOP
BEGIN
XXXX
END;
END LOOP;
5.变量赋值
V_TEST := 123;
6.用for in 使用cursor
...
IS
CURSOR cur IS SELECT * FROM xxx;
BEGIN
FOR cur_result in cur LOOP
BEGIN
V_SUM :=cur_result.列名1+cur_result.列名2
END;
END LOOP;
END;
7.带参数的cursor
CURSOR C_USER(C_ID NUMBER) IS SELECT NAME FROM USER WHERE TYPEID=C_ID;
OPEN C_USER(变量值);
LOOP
FETCH C_USER INTO V_NAME;
EXIT FETCH C_USER%NOTFOUND;
do something
END LOOP;
CLOSE C_USER;
8.用pl/sql developer debug
连接数据库后建立一个Test WINDOW
在窗口输入调用SP的代码,F9开始debug,CTRL+N单步调试
通过一个实际的例子学习Oracle存储过程
——创建存储过程
CREATE OR REPLACE PROCEDURE xxxxxxxxxxx_p
(
--参数IN表示输入参数,OUT表示输入参数,类型可以使用任意Oracle中的合法类型。
is_ym IN CHAR
)
AS
--定义变量
vs_msg VARCHAR2(4000); --错误信息变量
vs_ym_beg CHAR(6); --起始月份
vs_ym_end CHAR(6); --终止月份
vs_ym_sn_beg CHAR(6); --同期起始月份
vs_ym_sn_end CHAR(6); --同期终止月份
--定义游标(简单的说就是一个可以遍历的结果集)
CURSOR cur_1 IS
SELECT area_code,CMCODE,SUM(rmb_amt)/10000 rmb_amt_sn,SUM(usd_amt)/10000 usd_amt_sn
FROM BGD_AREA_CM_M_BASE_T
WHERE ym >= vs_ym_sn_beg
AND ym <= vs_ym_sn_end
GROUP BY area_code,CMCODE;
BEGIN
--用输入参数给变量赋初值,用到了Oralce的SUBSTR TO_CHAR ADD_MONTHS TO_DATE 等很常用的函数。
vs_ym_beg := SUBSTR(is_ym,1,6);
vs_ym_end := SUBSTR(is_ym,7,6);
vs_ym_sn_beg := TO_CHAR(ADD_MONTHS(TO_DATE(vs_ym_beg,’yyyymm’), -12),’yyyymm’);
vs_ym_sn_end := TO_CHAR(ADD_MONTHS(TO_DATE(vs_ym_end,’yyyymm’), -12),’yyyymm’);
--先删除表中特定条件的数据。
DELETE FROM xxxxxxxxxxx_T WHERE ym = is_ym;
--然后用内置的DBMS_OUTPUT对象的put_line方法打印出影响的记录行数,其中用到一个系统变量SQL%rowcount
DBMS_OUTPUT.put_line(’del上月记录=’||SQL%rowcount||’条’);
INSERT INTO xxxxxxxxxxx_T(area_code,ym,CMCODE,rmb_amt,usd_amt)
SELECT area_code,is_ym,CMCODE,SUM(rmb_amt)/10000,SUM(usd_amt)/10000
FROM BGD_AREA_CM_M_BASE_T
WHERE ym >= vs_ym_beg
AND ym <= vs_ym_end
GROUP BY area_code,CMCODE;
DBMS_OUTPUT.put_line(’ins当月记录=’||SQL%rowcount||’条’);
--遍历游标处理后更新到表。遍历游标有几种方法,用for语句是其中比较直观的一种。
FOR rec IN cur_1 LOOP
UPDATE xxxxxxxxxxx_T
SET rmb_amt_sn = rec.rmb_amt_sn,usd_amt_sn = rec.usd_amt_sn
WHERE area_code = rec.area_code
AND CMCODE = rec.CMCODE
AND ym = is_ym;
END LOOP;
COMMIT;
--错误处理部分。OTHERS表示除了声明外的任意错误。SQLERRM是系统内置变量保存了当前错误的详细信息。
EXCEPTION
WHEN OTHERS THEN
vs_msg := ’ERROR IN xxxxxxxxxxx_p(’||is_ym||’):’||SUBSTR(SQLERRM,1,500);
ROLLBACK;
--把当前错误记录进日志表。
INSERT INTO LOG_INFO(proc_name,error_info,op_date)
VALUES(’xxxxxxxxxxx_p’,vs_msg,SYSDATE);
COMMIT;
RETURN;
END;
发表评论
-
windows下oracle每天定时备份
2016-01-26 17:32 1464http://blog.csdn.net/jimmy609/ ... -
mysql用户管理和权限设置
2016-01-21 11:40 787http://www.cnblogs.com/fslnet ... -
SQL语句优化及原理
2016-01-14 16:14 903一、问题的提 ... -
Mysql日志操作 Windows下
2016-01-14 14:22 893日志文件类型概述: 1.错误日志 记录启动、运行或停 ... -
MongoDB专题、来源开发
2016-01-07 11:24 6581、maven+MongoDB+html5搭建的开源项目代 ... -
for update锁级别、存在的问题分析、for update of
2016-01-06 14:01 4023一、oracle默认在update ... -
oracle事务讲解、事务隔离级别实例
2016-01-06 13:47 1225今天温习oracle事务, ... -
oracle事务 set transaction readonly演示
2016-01-06 13:27 1142set transaction readonly 类似于S ... -
ORA-01034和ORA-27101的解决办法
2014-12-29 21:47 3376http://www.cnblogs.com/chuyu ... -
ORA-01207:文件比控制文件更新 - 旧的控制件
2014-12-20 09:06 999ORA-01207:文件比控制文件更新 - 旧的控制件 ... -
大数据处理之 专题笔记
2014-05-11 19:11 9191、oracle分区技术、应用详解 http://wenku ... -
oracle 之 Orapwd命令
2014-05-01 13:32 1159数据库密码忘记后,需要修改密码。 在数据库没有启动之前,数据库 ... -
Oracle问题集 之 ORA-01261: Parameter db_recovery_file_dest destination string cannot
2014-05-01 13:18 7622我本机安装的数据库版 ... -
Oracle工具sql 之 查询用户所有表sql
2013-11-26 20:29 868热度 1已有 104 次阅读2012-11-22 09:53 ... -
Oracle开发与优化 之 数据完整性和锁机制
2013-10-08 22:14 960Oracle数据完整性和锁机制——《12年资深DBA教你Ora ... -
存储过程 之 调用实例
2013-10-07 23:29 0CREATE OR REPLACE PROCEDURE PRO ... -
sql 之 distinct
2013-08-17 00:03 868distinct这个关键字用来 ... -
oracle、sqlserver语法区别一
2013-08-16 15:18 1034MySql: MySQL数据库实现分页比较简单,提供了 LIM ... -
提高数据库查询速度一
2013-06-02 23:50 9351、缓存,在持久层或持久层之上做缓存。 2、数据库表的大 ... -
oracle海量数量一
2013-05-29 23:57 919目录: Oracle数据完整性和锁机制 索引及优化之表分析 ...
相关推荐
在这个Oracle版本中,你可以找到与Oracle数据库兼容的SQL脚本,用于创建必要的表结构和初始化数据,以便XXL-JOB可以在Oracle数据库上正常运行。 XXL-JOB使用Java语言开发,这使得它能够无缝集成到大多数Java企业...
对于Oracle数据库的支持,XXL-JOB会创建相应的数据库表来存储任务信息、执行日志等数据。在部署此版本之前,你需要确保你的Oracle数据库已经准备好,包括但不限于创建数据库用户、权限分配以及安装必要的Oracle驱动...
**XXL-JOB定时任务框架Oracle版本详解** XXL-JOB是一个分布式任务调度平台,它提供了简单易用的API和Web界面,使得开发者能够轻松地实现任务的分布式调度。XXL-JOB 2.4.0是该框架的一个重要版本,针对Oracle数据库...
Oracle Job 定时任务 Oracle Job 定时任务是 Oracle 数据库中的一种定时执行任务的机制,它允许用户在指定的时间点或每天的某个时间点自行执行任务。 一、查询系统中的 Job 可以通过以下视图查询系统中的 Job: *...
因此,需要在服务器上配置合适的数据库(如MySQL、Oracle等),并创建对应的数据库表。根据官方文档配置数据库连接参数,如URL、用户名、密码等。 4. **ElasticJob-Lite配置**:在控制台应用启动后,需要进行...
Oracle的Job定时功能是Oracle数据库系统提供的一种自动化任务调度机制,允许用户设定特定的时间点或时间间隔执行数据库操作。在项目开发中,特别是在大数据管理和分析的场景下,定时任务经常被用于更新数据、生成...
plsql创建存储过程并创建job定时任务执行详细笔记文档总结 在 Oracle 中,plsql 是一种强大的编程语言,可以用来创建存储过程和定时任务执行。在本文中,我们将详细介绍如何使用 plsql 创建存储过程并创建 job 定时...
- 首先,你需要在本地或者服务器上安装Oracle数据库,并创建对应的XXL-JOB数据库表。 - 然后,下载并解压`xxl-job-oracle-master`压缩包,分别编译调度中心和执行器的代码。 - 将编译后的jar文件部署到服务器,...
1. **分布式任务调度**:XXL-JOB作为一个分布式任务调度框架,能够帮助开发者管理和执行分布式任务,支持定时、周期性、一次性等多种任务类型。 2. **Spring Boot集成**:由于通常Java应用的jar包运行方式,XXL-JOB...
本文将详细阐述如何在Oracle中查询并停止正在运行的JOB,包括关键步骤、涉及的表与视图以及具体的命令应用。 #### 1. 相关表与视图 - **`dba_jobs`**: 包含数据库中所有JOB的信息,包括计划、状态等。 - **`all_...
ElasticJob 是一个轻量级的分布式任务调度框架,它结合了分片与定时任务,旨在解决大规模分布式系统中的任务调度问题。 一、ShardingSphere 简介 ShardingSphere 是一个开源的数据库中间件,致力于提供数据库网格...
Oracle JOB 定时任务 定时执行存储过程
例如,可能需要每分钟将一个表中的数据更新到另一个表中,这样的任务可以通过创建 Oracle 的 Job 来实现。 #### 一、准备工作 1. **创建目标表**:首先需要创建一个用于存储定时更新数据的目标表。 ```sql ...
接下来,我们将通过具体的示例来展示如何使用DBMS_JOB API来管理和操作Oracle定时任务。 ##### 示例1:创建一个新的job ```sql BEGIN DBMS_JOB.SUBMIT ( job => 1, -- job ID what => 'BEGIN MY_PROCEDURE; END...
### DBMS_JOB包创建Oracle定时任务详解 在Oracle数据库中,`DBMS_JOB`包提供了一种机制,用于创建和管理后台作业(Job),这些作业可以在特定的时间或按一定的时间间隔执行。这对于需要定期执行的任务非常有用,...
在Oracle数据库系统中,"JOB"是用于调度和自动化任务执行的一种功能,它允许你在预定义的...通过编写和应用适当的脚本,我们可以轻松创建、管理和控制这些定时任务,确保我们的数据库系统按照预定的时间表高效运行。
Oracle Job管理是Oracle数据库中的一个关键特性,用于自动化执行数据库任务,如定时备份、数据清理或报告生成等。以下是对Oracle Job管理的详细解释: 1. **创建Job**: 在Oracle中,你可以通过创建存储过程来定义...
7. Oracle 定时任务的检查和修复步聚:通过检查 JOB_QUEUE_PROCESSES 参数的设置和修改,重启数据库,可以修复 Oracle 定时任务不能自动执行的问题。 这篇文章总结了 Oracle 定时任务不能自动执行的问题的检查和...
Oracle Job管理是数据库中用于定时执行任务的一种机制,它允许用户安排存储过程、PL/SQL块或其他数据库操作在预设的时间点自动运行。在Oracle 9i版本中,我们可以使用SQL命令或者DBMS_SCHEDULER包来创建、修改和管理...
Oracle数据库定时删除表空间的数据并释放表空间是通过创建存储过程和定时任务来实现的。下面详细讲解该知识点: 一、创建存储过程 首先,需要创建一个存储过程来删除过期的数据。该存储过程将计算出当前时间减去七...