DBMS_JOB中的DDL语句

时间:2012-05-25 06:22:16

标签: oracle ddl dbms-job

我正在尝试使用DBMS_JOB计划作业(出于安全原因,我不能使用DBMS_SCHEDULER),它使用DDL语句。

DECLARE
job_num NUMBER;
BEGIN
DBMS_JOB.SUBMIT(job => job_num,
what => 'BEGIN EXECUTE IMMEDIATE ''CREATE TABLE temp1 (ID NUMBER)''; END;'
);
DBMS_OUTPUT.PUT_LINE('JobID'||job_num);
DBMS_JOB.RUN(job_num);
END;
/

无法执行给我一条错误消息:

  

ORA-12011:执行1个作业失败   ORA-06512:在“SYS.DBMS_IJOB”,第548行   ORA-06512:在“SYS.DBMS_JOB”,第278行   ORA-06512:第8行

从匿名块中删除 DBMS_JOB.RUN()语句后,我至少可以创建(并保存)该作业。当我检查作业时,它已将其保存为要执行的代码     BEGIN EXECUTE IMMEDIATE'CREATE TABLE temp1(id NUMBER)'; END;

如果我独立执行它,它显然会执行。当我尝试通过调用DBMS_JOB.RUN()来执行整个操作时,它唯一失败的时候。

在DBMS_JOB中使用DDL语句作为参数是否有限制?我在文档中找不到任何指针。

1 个答案:

答案 0 :(得分:2)

虽然回应其他评论者的观点 - 在飞行中创建表格是一个红旗,通常表明你真的应该使用全球临时表 - 几个问题。

  1. 您是否需要DBMS_JOB.RUN来电?您对DBMS_JOB.SUBMIT的调用告诉Oracle在父事务提交后异步运行作业。所以,通常情况下,你会调用DBMS_JOB.SUBMIT,然后调用`COMMIT'。
  2. 提交作业的用户是否直接授予CREATE TABLE权限?我的猜测是用户只有通过角色授予的CREATE TABLE权限。这将允许您以交互方式运行匿名PL / SQL块,但不能在作业中运行。如果是这样,您需要DBA直接授予您CREATE TABLE权限,而不是通过角色授予您。
  3. 当作业失败时,会将一个条目写入警报日志并显示错误消息。您(或者更可能是DBA)是否可以从警报日志中获取错误消息和错误堆栈并将其发布到此处(假设它不是来自#2的特权问题)。