DBMS_JOB 中的 DDL 语句

Posted

技术标签:

【中文标题】DBMS_JOB 中的 DDL 语句【英文标题】:DDL Statements in DBMS_JOB 【发布时间】:2012-05-25 06:22:15 【问题描述】:

我正在尝试使用 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) ';结束;

如果我单独执行它,它显然会执行。当我尝试通过调用 DBMS_JOB.RUN() 来执行整个事情时,它唯一一次失败了。

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

【问题讨论】:

我从来没有听说过错误信息“always”... 添加了我得到“总是”的错误消息 您能否详细说明阻止您使用 DBMS_Scheduler 的安全原因?另外,您是否考虑过使用全局临时表?看到正在创建一个名为 TEMP 的表有点危险。 无法重现。它对我有用(在 11gR2 中测试),并且该作业按预期创建了表“TEMP”。 +1 对 Aldridge 的评论 - 即时创建表格通常是系统设计不佳的标志。 【参考方案1】:

虽然与其他评论者的观点相呼应 - 动态创建表是一个危险信号,通常表明您确实应该使用全局临时表 - 有几个问题。

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

【讨论】:

谢谢贾斯汀。这很有帮助。我将首先与 DBA 确认创建表的权限!

以上是关于DBMS_JOB 中的 DDL 语句的主要内容,如果未能解决你的问题,请参考以下文章

雪花函数中的 DDL 语句

lightdb22.3-oracle 内置包兼容增强

PL/SQL 中的 DDL 语句?

ddl语句中的oracle区分大小写[重复]

通过阅读 Python 中的 Oracle DDL 语句为 Redshift 创建 Create Table 语句

自治事务中的 Oracle DDL