PLS-00103:在 DBMS_SCHEDULER 中遇到符号

Posted

技术标签:

【中文标题】PLS-00103:在 DBMS_SCHEDULER 中遇到符号【英文标题】:PLS-00103: Encountered the symbol in DBMS_SCHEDULER 【发布时间】:2022-01-23 22:28:36 【问题描述】:

在作业中调用包会给出错误报告 -

ORA-06550: line 8, column 5:
PLS-00103: Encountered the symbol "
  );
end; : AUXSQLDBIND4: = SqlDevBind1Z_1; : AUXSQLDBIND3: = SqlDevBind1Z_2; : AUXSQLDBIND2: = SqlDevBind1Z_3; : AUXSQLDBIND1: = SqlDevBind "

使用传递的变量 work_date 帮助调用数据包,以进行每月每一天的特定计算。

提前感谢您的帮助!

DBMS_SCHEDULER.create_job (
job_name => 'J_ACCOUNT_TURNOVER_F',
job_type => 'PLSQL_BLOCK',
start_date => SYSTIMESTAMP, enabled => TRUE,
job_action => 
'declare
start_date number;
end_date number;
work_date date;
begin
start_date := to_number(to_char(to_date('2018-01-01', 'yyyy-MM-dd'), 'j'));
end_date := to_number(to_char(to_date('2018-01-31', 'yyyy-MM-dd'), 'j'));
for cur_r in start_date..end_date loop
 work_date := to_char(to_date(cur_r, 'j'), 'yyyyMMdd');
 dma.fill_account_turnover_f.fill(work_date);
end loop;
end;'
);
end;

【问题讨论】:

用于 dbms_scheduler 的 SQL Developer 的 GUI 将允许您单击并输入此内容,最后是否会为您提供您正在寻找的整个 PL/SQL 块 【参考方案1】:

如果您创建一个存储过程并调用它,而不是将该匿名 PL/SQL 块嵌入到DBMS_SCHEDULER.CREATE_JOB 调用中,那不是更简单吗?现在你必须转义单引号,即每次使用两个连续的单引号。像这样的:

begin
DBMS_SCHEDULER.create_job (
job_name => 'J_ACCOUNT_TURNOVER_F',
job_type => 'PLSQL_BLOCK',
start_date => SYSTIMESTAMP, enabled => TRUE,
job_action => 
'declare
start_date number;
end_date number;
work_date date;
begin
start_date := to_number(to_char(to_date(''2018-01-01'', ''yyyy-MM-dd''), ''j''));
end_date := to_number(to_char(to_date(''2018-01-31'', ''yyyy-MM-dd''), ''j''));
for cur_r in start_date..end_date loop
 work_date := to_char(to_date(cur_r, ''j''), ''yyyyMMdd'');
 dma.fill_account_turnover_f.fill(work_date);
end loop;
end;'
);
end;
/

【讨论】:

在不调用过程的情况下解决问题很有趣。谢谢您的帮助。你解决了我的问题。 :) 不客气。【参考方案2】:

也许您对存储过程过敏 :) 您可以这样做,而不必逃避每个单独的报价。它被称为“Q Quote 语法”。

DBMS_SCHEDULER.create_job (
job_name => 'J_ACCOUNT_TURNOVER_F',
job_type => 'PLSQL_BLOCK',
start_date => SYSTIMESTAMP, enabled => TRUE,
job_action => 
q'!declare
start_date number;
end_date number;
work_date date;
begin
start_date := to_number(to_char(to_date('2018-01-01', 'yyyy-MM-dd'), 'j'));
end_date := to_number(to_char(to_date('2018-01-31', 'yyyy-MM-dd'), 'j'));
for cur_r in start_date..end_date loop
 work_date := to_char(to_date(cur_r, 'j'), 'yyyyMMdd');
 dma.fill_account_turnover_f.fill(work_date);
end loop;
end;'
);
end;!'

this 问题中的更多示例

【讨论】:

以上是关于PLS-00103:在 DBMS_SCHEDULER 中遇到符号的主要内容,如果未能解决你的问题,请参考以下文章

获取 PLS-00103:在创建包时遇到符号“/”错误

匿名程序的 PLS-00103 错误

PLS-00103 遇到符号“数字”

错误(30,11):PLS-00103:遇到符号更新错误

错误:PLS-00103:在预期以下情况之一时遇到符号“)”

oracle函数错误pls-00103