【发布时间】:2020-06-02 19:34:36
【问题描述】:
我看到很多类似的问题已经得到解答,包括 here、here 和 here。名单还在继续。
是什么让我的与众不同?这些其他的问题看起来很简单,一行sql语句。我有一个更复杂的合并语句,它跨越多行,无论我如何尝试将语句放在一起,它都会给我一个编译错误。下面是一种这样的尝试。
这是一个很长的语句,唯一的动态部分是最开始的两行不连续的行,如下所示。我试图将整个语句变成一个字符串并执行它,但是我得到一个错误,即字符串太长,而且这使得它很难阅读,所以它是不可取的。我还尝试将需要动态 sql 的 2 个部分分解为 2 个执行立即块,但这也会引发编译错误。
我的代码
create or replace procedure table_sync(
table_name in varchar2,
source_node in varchar2
)
is
begin
execute immediate
'merge into ' || table_name || ' dest' /* ---- first line ---- */
using (select date_time, version_date, data_entry_date, value
'from username.' || table_name || '@' || source_node /* ---- second line ---- */
where data_entry_date < (sysdate - 10)) src
on ( dest.date_time = src.date_time and
dest.version_date = src.version_date
)
when matched then
update
set
dest.data_entry_date = src.data_entry_date,
dest.value = src.value
where
(case
.
.
.
有没有办法把这个动态语句组合起来?
谢谢
【问题讨论】:
-
你似乎缺少一些引号,另外,尝试将动态查询字符串分配给一个 clob,然后使用 `execute immediate stmnt' 执行它。
-
那集之后的目标是什么?
-
@Viorel 该脚本的目标是确保来自不同服务器的两个表同步。其余的是业务逻辑,具体取决于一个是否具有较晚的 data_entry_date 或一个是否受保护等。我将把分配视为一个 clob。什么部分应该是字符串?只有第一部分还是整个陈述?
-
整个语句都要是,我写个fiddle,作为例子。
标签: sql oracle stored-procedures dynamic-sql