http://blog.csdn.net/cuihaiyang/article/details/7872982

因为业务需要每月需要增加一个序列,想到了使用job定时创建,每次创建一年的。写此job的过程中遇到一些问题,在此记录一下。

第一步:写创建序列(sequence)的存储过程。代码如下:

  1. create or replace procedure pro_create_seq(sequencePrefix in varchar2)
  2. is
  3. strYear varchar2(4);
  4. strMonth varchar2(6);
  5. strSql varchar2(500);
  6. begin
  7. select to_char(sysdate,'yyyy') into strYear from dual;
  8. for i in 1..12 loop
  9. strMonth:=strYear||lpad(i,2,'0');--组装月份,形如:201201
  10. strSql:='create sequence '||sequencePrefix||strMonth||' start with 1 increment by 1 MINVALUE 0 MAXVALUE 99999999999 ';
  11. execute immediate strSql;
  12. end loop;
  13. end pro_create_seq;

创建存储过程成功,但测试该报错了:

SQL> exec pro_create_seq('FACTORY_NOTICE_INFO_DB_');
 
begin pro_create_seq('FACTORY_NOTICE_INFO_DB_'); end;
 
ORA-01031: 权限不足
ORA-06512: 在 "YCPS.PRO_CREATE_SEQ", line 16
ORA-06512: 在 line 2

在网上搜索解决方法发现原来是在存储过程中ROLE无效,需要显示授权。见http://topic.csdn.net/u/20110507/21/8fb89cfa-30b4-41d0-9ebf-57ea74057960.html?27630

即有两种解决方法:

1、通过GRANT CREATE SEQUENCE TO YCPS;来显示给用户授权
2、修改存储过程,加入Authid Current_User时存储过程可以使用role权限。

我采用了第二种方法,即加入Authid Current_User,修改后的存储过程如下:

  1. create or replace procedure pro_create_seq(sequencePrefix in varchar2)
  2. <span style="color:#ff0000;">Authid Current_User</span> --赋予role权限
  3. is
  4. strYear varchar2(4);
  5. strMonth varchar2(6);
  6. strSql varchar2(500);
  7. begin
  8. select to_char(sysdate,'yyyy') into strYear from dual;--取年份,形如:2012
  9. for i in 1..12 loop
  10. strMonth:=strYear||lpad(i,2,'0');--组装月份,形如:201201
  11. strSql:='create sequence '||sequencePrefix||strMonth||' start with 1 increment by 1 MINVALUE 0 MAXVALUE 99999999999 ';
  12. execute immediate strSql;
  13. end loop;
  14. end pro_create_seq;

SQL> exec pro_create_seq('FACTORY_NOTICE_INFO_DB_');
 
PL/SQL procedure successfully completed

执行成功。

第二步:创建job,定时调用存储过程来创建sequence

  1. variable job1 number;
  2. begin
  3. dbms_job.submit(:job1,'PRO_CREATE_SEQ(''FACTORY_NOTICE_INFO_DB_'');PRO_CREATE_SEQ(''FACTORY_NOTICE_INFO_XB_'');',sysdate,'add_months(TRUNC(SYSDATE,''yyyy''),12)');
  4. commit;
  5. end;

SQL> variable job1 number;
SQL>  begin
  2   dbms_job.submit(:job1,'PRO_CREATE_SEQ(''FACTORY_NOTICE_INFO_DB_'');PRO_CREATE_SEQ(''FACTORY_NOTICE_INFO_XB_'');',sysdate,'add_months(TRUNC(SYSDATE,''yyyy''),12)');
  3   commit;
  4   end;
  5  /
 
PL/SQL procedure successfully completed
job1
---------
84
 
SQL> begin
  2  dbms_job.run(84);
  3  end;
  4  /
 
begin
dbms_job.run(84);
end;
 
ORA-12011: 无法执行 1 作业
ORA-06512: 在 "SYS.DBMS_IJOB", line 637
ORA-06512: 在 "SYS.DBMS_JOB", line 284
ORA-06512: 在 line 3

可见,job创建成功了,但执行出错。查询ORA-12011错误的说明如下:

ORA-12011: execution of string jobs failed
Cause: An error was caught in dbms_ijob.run from one or more jobs which were due to be run.
Action: Look at the alert log for details on which jobs failed and why.
 
SQL> select value from v$diag_info where name='Diag Trace';
 
VALUE
--------------------------------------------------------------------------------
/u01/app/oracle/diag/rdbms/ycps/ycps1/trace

上面查找到alert log的路径,日志文件内容如下:

Thu Aug 16 14:30:57 2012
Errors in file /u01/app/oracle/diag/rdbms/ycps/ycps1/trace/ycps1_ora_2622362.trc:
ORA-12012: 自动执行作业 84 出错
ORA-01031: 权限不足
ORA-06512: 在 "YCPS.PRO_CREATE_SEQ", line 15
ORA-06512: 在 line 1

可见,仍然是权限问题。然而通过exec pro_create_seq('FACTORY_NOTICE_INFO_DB_');调用存储过程却可以执行,很让人费解。后来在http://topic.csdn.net/u/20100611/11/deec0f8f-0749-4478-acba-114a84300360.html说需要显式授权,也就是前面提到的方法2,于是测试了一下,竟然成功了:

SQL> conn sys/oracle@psdb as sysdba
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 
Connected as SYS
 
SQL> grant create sequence to ycps;
 
Grant succeeded
 
SQL> conn ycps/ycps@psdb
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 
Connected as ycps
 
SQL> begin
  2  dbms_job.run(84);
  3  end;
  4  /
 
PL/SQL procedure successfully completed
看来Authid Current_User的使用是有局限的,在通过存储过程来执行DDL语句时需要注意授权问题

ORACLE通过JOB定时创建序列的更多相关文章

  1. Oracle(创建序列)

    概念: 所谓序列,在oracle中就是一个对象,这个对象用来提供一个有序的数据列,这个有序的数据列的值都不重复. 1.序列可以自动生成唯一值 2.是一个可以被共享的对象 3.典型的用来生成主键值的一个 ...

  2. oracle创建新的用户 创建序列 并生成自动自增

    1.用有dba权限的用户登录:sys用户 system 口令:manager 2.创建一个新用户:create user abc identified by 123456; 3.授予DBA权限: gr ...

  3. Oracle创建序列,Oracle创建序列语法

    -- Oracle创建序列 Create sequence CREATE SEQUENCE SEQ_SINGER -- 序列名称  START WITH 2 -- 开始数字  MAXVALUE 999 ...

  4. oracle视图就是封装了一条写好的sql语句 可通过视图修改表结构 ; oracle需要手动创建序列

    create sequence student_sid; --创建序列 oracle只能通过手动方式创建序列

  5. Oracle创建表和创建序列和修改,增加sql字段

    一.创建表 create table y_parts_classify( pt_id number(10) not null, pt_name varchar2(1000), update_time ...

  6. oracle创建序列,并插入记录

    Oracle序列创建和使用创建序列 语法 CREATE SEQUENCE 序列名 [相关参数] 参数说明 INCREMENT BY  : 序列变化的步进,负值表示递减.(默认1) START WITH ...

  7. Oracle笔记 五、创建表、约束、视图、索引、序列、同义词、表空间

    alter table userInfo add(msn varchar2(20)); 1.建表 create table userInfo ( id number(6), name varchar2 ...

  8. 分享知识-快乐自己:Oracle 创建序列 及 使用序列

    1.创建序列语法: create sequence 序列名 [可选参数] 序列名常定义为‘seq_XXX’的形式,创建序列不能使用replace 可选参数说明: increment by: 序列每次增 ...

  9. Oracle学习总结_day06_视图&序列&索引

    本文为博主辛苦总结,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用. 转载请注明 出自 : luogg的博客园 谢谢配合! day 06 视图,索引,序列 视图 什么是视图: 视 ...

随机推荐

  1. Flutter移动电商实战 --(23)分类页_左侧类别导航制作

    自动生成dart类 https://javiercbk.github.io/json_to_dart/ 生成的代码 class Autogenerated { String code; String ...

  2. centos7 设置 tomcat 开机自启

    1.创建文件 # vi /etc/systemd/system/tomcat.service [Unit] Description=Tomcat8540 After=syslog.target net ...

  3. express利用nodemailer发送邮件(163邮箱)

    Nodemailer 是一个简单易用的Node.js邮件发送组件 首先安装这个组件 npm install nodemailer --save 安装之后,可以在某个get请求下,发送邮件,具体路由代码 ...

  4. 18.flannel

    18.flannel docker有四种常用网络 bridge joined opended 直接共享使用节点的网络名称空间 none k8s网络通信: 容器间的通信: 同一个Pod内的多个容器之间通 ...

  5. linux系统下的rz、sz详解

    对于linux服务器来说,通常我们是通过一些ssh工具进行远程访问连接的,而对于经常使用它的人来说,少不了将文件上传下载到服务器.如何能够快速的同服务器进行文件的交互尤为重要.不然每次都打开单独的ss ...

  6. PowerDesigner设置code和name不联动的方法

    按照如下设置即可: 具体步骤:菜单:Tools--General Options--Name to Code mirroring的复选框不要选中.

  7. python基础--list

    定义list-->l=[] stus=['张三','李四','王五'] list增删改查 #增 stus.append('狄仁杰')#增加---append在list末尾增加一个元素 stus. ...

  8. MongoDB可视化工具Studio 3T的使用

    原文地址:https://blog.csdn.net/weixin_39999535/article/details/81383196 studio3T 永久使用方法 新建文件studio3t.bat ...

  9. 如何设置payjs的微信jsapi支付目录

    首先你得是 payjs 的有效开通用户.不清楚 payjs 是干什么的可以自行百度. 设置方法非常简单,在后台菜单-系统设置-JSAPI目录设置,在右侧填写支付目录即可. 需要注意的是:支付目录需要配 ...

  10. MySQL问题:Access denied for user 'mysql'@'localhost'

    deep@deep-PC:~$ sudo mysql -uroot -p mysql> update mysql.user set authentication_string=PASSWORD( ...