1.创建存储过程分表
CREATE OR REPLACE PROCEDURE CREATE_DAY_TABLE IS
/*变量*/
grantSql VARCHAR2(50);
dayStr VARCHAR2(8);
tableCount int(2);
createSql VARCHAR2(1000);
BEGIN
/*给当前用户赋予权限*/
grantSql := 'grant create any table to userName';
EXECUTE IMMEDIATE grantSql;
/*每天创建一个新表 注意create table 后边的空格*/
SELECT TO_CHAR(SYSDATE, 'yyyyMMdd')+1 INTO dayStr FROM dual;
createSql := 'CREATE TABLE ' || 'TEST_TABLE_DAY_' || dayStr ||
'( TESTID VARCHAR2(100),
TESTNAME VARCHAR2(100),
SEX NUMBER DEFAULT 1 )';
SELECT COUNT(1) INTO tableCount FROM user_tables WHERE table_name = CONCAT('TEST_TABLE_DAY_', dayStr);
--表名不存在时,创建
IF tableCount = 0 THEN
EXECUTE IMMEDIATE createSql;
COMMIT;
END IF;
END CREATE_DAY_TABLE;
2.定时执行存储方法
2.1创建定时器
DECLARE
jobno NUMBER;
BEGIN
dbms_job.submit(
jobno, --定时器ID,系统自动获得
'CREATE_DAY_TABLE;', --what执行的过程名,注意存储方法后面必须要有分号
SYSDATE, --next_date,定时器开始执行的时间,这样写表示立即执行
'TRUNC(sysdate,''mi'') + 1/ (24*60)' --interval,设置定时器执行的频率,这样写每隔1分钟执行一次
);
COMMIT;
END;
创建成功后,默认开启定时任务
注意:存储方法后面必须要有分号,否则报错
PLS-00103: 出现符号 "END"在需要下列之一时:
:= . ( @ % ;
符号 “;” 被替换为 “END” 后继续。
2.2.查看定时任务
select * from user_jobs;
执行结果如下:
2.3关闭定时器
BEGIN
DBMS_JOB.BROKEN(64, TRUE, SYSDATE);
COMMIT;
END;
2.4开启定时器
BEGIN
DBMS_JOB.RUN(64);
COMMIT;
END;
2.5删除指定任务
BEGIN
DBMS_JOB.REMOVE(64);
commit;
END;
注意:如果存储过程有误,定时任务仍可以正常执行,但是下图红框中的时间数据会缺失。