Oracle如何通过job定时创建表?

5个月前 (10-16 08:50)阅读3回复0
xxhh
xxhh
  • 管理员
  • 注册排名4
  • 经验值139595
  • 级别管理员
  • 主题27919
  • 回复0
楼主

  第一步:创建一个施行创建操做的存储过程

在那一步起首要处理的问题就是构造表名。在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变量。

0
回帖

Oracle如何通过job定时创建表? 期待您的回复!

取消