【发布时间】:2020-03-19 12:33:27
【问题描述】:
我面临以下任务:在 Oracle 12c 数据库上并行一些进程。与往常一样,我已经开始使用dbms_parallel_execute 包来制作它。使用dbms_parallel_execute.run_task 过程创建了一个新任务,并将我的匿名块与存储过程调用作为sql_stmt 参数传递。
l_sql := 'BEGIN my_procedure(:start_id, :end_id); END;';
dbms_parallel_execute.run_task
(
task_name => l_task_name,
sql_stmt => l_sql,
language_flag => dbms_sql.native,
parallel_level => l_parallel_level
);
这个存储过程调用了几个其他的过程。
因此,我的“父”程序失败,出现以下异常:
PLS-00103: Encountered the symbol "." when expecting one of the following:
( begin case declare exit for goto if loop mod null pragma
raise return select update while with <an identifier>
<a double-quoted delimited-identifier> <a bind variable> <<
continue close current delete fetch lock insert open rollback
savepoint set sql execute commit forall merge pipe purge
The symbol "<an identifier>" was substituted for "." to continue.
我发现,这个异常是因为在过程中调用EXECUTE IMMEDIATE而引发的:
l_sql := 'BEGIN ' || some_another_pkg.schema_name || '.some_pkg.some_procedure(:1, :2); END;'
EXECUTE IMMEDIATE l_sql
USING l_param_1, l_param_2l
其中schema_name 是some_another_pkg 包内的VARCHAR2(30) 的全局变量。
当我将其更改为转发过程调用时,异常消失了。但我无法在目标环境中替换此 EXECUTE IMMEDIATE。
是否有任何解决方法可以在不替换 EXECUTE IMMEDIATE 调用的情况下解决此问题?
提前致谢。
【问题讨论】:
-
请在调用 execute immediate 之前打印出 l_sql 的确切值,并发布 minimal reproducible example 谢谢。
-
什么是
get_package变量? -
没有足够的信息来真正帮助解决这个问题,但是根据您提供的内容,您的
EXECUTE IMMEDIATE语句末尾是否有分号? -
@OldProgrammer,我的错,在我的问题中添加了一些更改。
l_sql变量使用另一个包中的全局变量连接。 -
@TenG,是的,这是现有代码的一部分,它工作正常,但如果它在并行执行中运行,则会失败。