问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Oracle通过job定时创建表

发布网友 发布时间:2022-04-23 01:08

我来回答

1个回答

热心网友 时间:2022-04-08 00:44

在项目中,经常会遇到需要定时完成的任务,比如定时更新数据,定义统计数据生成报表等等,其实这些事情都可以使用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 al;  TO_CHAR(SYSDATE,’YYYY/MM/DDHH2  ------------------------------  2009/02/14 17:22:41  以上SQL格式化输出了时间,要得到我们所需要的格式直接修改一下SQL即可  SQL> select to_char(sysdate, ’yyyymmdd’) from al;  TO_CHAR(SYSDATE,’YYYYMMDD’)  ---------------------------  20090214  得到时间格式字符串后我们就可以将表名的前缀和时间连接在一起形成完整的表名。这里需要注意,在Oracle中链接两个字符串需要使用‘||’符号,而在Sql Server中直接使用‘+’号就可以了,因为我以前一直在Sql Server下编程,好久都没编写Oracle的SQL所以费了很大的功夫才发现这个问题。完整的Sql就是  SQL> select ’tbl_programme_’ || to_char(sysdate, ’yyyymmdd’) from al;  ’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 procere sp_createtab_tbl_programme  Authid Current_User  as  tabname varchar(200);  begin  select ’TBL_PROGRAMME_’ || to_char(sysdate, ’yyyymmdd’) into tabname from al;  --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  �0�5 每天:trunc(sysdate+1)  �0�5 每周:trunc(sysdate+7)  �0�5 每月:trunc(sysdate+30)  �0�5 每个星期日:next_day(trunc(sysdate),’SUNDAY’)  �0�5 每天6点:trunc(sysdate+1)+6/24  �0�5 半个小时: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 procere SP_CREATETAB_TBL_PROGRAMME  prompt =============================================  prompt  create or replace procere sp_createtab_tbl_programme  Authid Current_User  as  tabname varchar(200);  begin  select ’TBL_PROGRAMME_’ || to_char(sysdate, ’yyyymmdd’) into tabname from al;  --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
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
高中文言百段阅读训练目录 储罐如何评价李时行的书法与人品? 李时行嗜书不厌的通假字 李时行嗜书不厌 李时行是个什么样的人 文言文 李时行嗜书不厌急需翻译!!!~~~ 身高160cm体重60kg肩宽40胸围96腰围82穿多大码衣服? 上海外服交通银行项目怎么样,待遇是多少,工作时间是什么?公司好不好... “屋外下雨屋内漏”愁坏业主,中梁首府开发商:逐步解决 椒江中梁有哪些楼盘 中梁控股集团有哪些楼盘 求英文参考文献 关于java和oracle和短信网站平台介绍的 翻译后4000-500... 我在plsql中使用dblink访问远程数据库上的表,执行select后为什么plsql... ...目前没什么基础准备去培训,想学oracle的话是不是需要掌握linux的技术... oracle 如何减肥? 求Oracle市场总监黄玮的资料 探求Oracle数据库怎样存储图片 0基础如何成为OracleDBA oracle的发展历史是怎样的 什么是数据库的实例instance 怎样写出精彩的Oracle DBA简历! 1.1 什么是Oracle数据库 关于oracle PLSQL?? GDI是什么发动机 起亚k5后面的gdi是什么意思 现代全新胜达后面的gdi是什么意思 长安逸动xt,gdi是什么意思? 现代gdi是什么车型 GDI是什么意思? 汽车GDI+DCT什么意思 起亚,GDI什么意思 电脑键盘上shift+键在哪 四级营养师报考条件? 四级营养师是什么? 绘出一条含四级营养级的食物链 公共营养师四级多少分及格 四级公共营养师报名条件是什么? 国家四级营养师与三级的区别? 公共营养师四级都考什么?需要买哪些教材? 公共营养师证的高级,中级,初级和2级,3级,4级有什么区别? 四级公共营养师要具备哪些条件啊? 四级公共营养师报考条件 四级公共营养师到底有没有用啊? 全国营养师分几个等级? 四级和三级营养师证有什么区别 关于四级营养师考试 公共营养师分几个级别? 公共四级营养师难考吗??还有需要考那些 有营养师资格证(四级)可以从事哪些职业? 公共营养师一定要考四级先么? 有营养师资格证(四级)可以从事哪些职业