日期:2014-05-16  浏览次数:20529 次

job里面执行DDL语句

项目中用到几个编号。之前曾经做了 根据序列去取值,然后在程序中 去组合字符串生成编号,但是总觉得不怎么好、后来干脆每天把序列删了重建。采用Oracle 的 的job 来定期执行该任务。

1 创建序列

??

create sequence houseno increment by 1 start with 1 maxvalue 1000; 

?

2 创建过程

create or replace procedure housenopro
 as
   tsql   varchar2(100);
Begin
  tsql:=' drop sequence houseno ';
  execute immediate tsql;
  tsql:='create sequence houseno increment by 1 start with 1 maxvalue 1000';
  execute immediate tsql;
  end;
/

?

?3 建立job

variable housenojob number;
BEGIN
DBMS_JOB.SUBMIT(:housenojob,'housenopro;',sysdate,'sysdate+1'); 
COMMIT;
END;
/

?

?

4执行job

variable housenojob number;
BEGIN
DBMS_JOB.SUBMIT(:housenojob,'housenopro;',sysdate,'sysdate+1'); 
COMMIT;
END;
/

?

注意,在执行2 的时候 会出现错误提示,说当前权限不够,经过多番搜索,发现了一个问题。

原来 在 Oracle 中。如果想在 匿名块 或者过程 中来执行DDL 语句时。都必须先 要把 相对应的权限(比如 create table , drop table ,create sequence ,drop sequence ,Create public synonym,
? Drop public synonym ,Create trigger,Create View, 等)直接赋给该用户,之前通过角色的授权将会失效。?

?

所以 应先登录到管理员上面。给你的当前用户授权。

Grant Create Table,Create sequence, Create trigger, 
  Create procedure, Drop any sequence, Create public synonym, 
  Drop public synonym to aws

?

之后,一切 ok。? 之前问同事说 不能动态执行DDL 语句,因为需求有时候需要在程序中去创建一些东西,以后赋予相对应的权限就行了。