我想编写从更新语句到合并合并语句的动态查询
Posted
技术标签:
【中文标题】我想编写从更新语句到合并合并语句的动态查询【英文标题】:I want to write dynamic query from update statement to merge merge statement 【发布时间】:2019-07-29 08:10:56 【问题描述】: 'UPDATE ' || T1_TABLENAME || ' t1 ' || 'SET ( ' ||
v_t1_fields || ' ) = (SELECT ' || v_t2_fields || ' FROM ' ||
T2_TEMPTABLE_NAME || ' tmp WHERE ' || v_con || ' ) ' ||
' WHERE EXISTS ( SELECT 1 FROM ' || T2_TEMPTABLE_NAME ||
' tmp WHERE ' || v_con || ' )';
-- HERE v_con = t1.D=t2.D,
v_t1_fields-it can store dynamically-A,B,C
v_t2_fields-it can store dynamically-A,B,C
------------
MERGE INTO TABLE1 t1
USING TABLE2 t2
ON(t1.D=t2.D)
WHEN MATCHED THEN
UPDATE
SET
t1.A=t2.A,
t1.B=t2.B, //update set (t1.A,t1.B,t1.C =t2.A,t2.B,t2.C) not work
t1.C=t2.C;
------------------
'MERGE INTO ' TABLE1 || ' t1 ' ||
' USING ' TABLE2 || ' t2 ' ||
' ON ( ' || v_cons || ' )
when matched then update set ('
|| v_t1_fields || ') = '( || v_t2_fields || ' );' // Its not work--ORA-01747: invalid user.table.column, table.column, or column specification
然后我使用 reg_exp 来拆分列
---------------------------
v_Sql := 'MERGE INTO ' TABLE1 || ' t1 ' ||
' USING ' TABLE2 || ' t2 ' ||
' ON ( ' || v_cons || ' )
when matched then update set ('
( ' || regexp_substr(v_t1_fields, '[^,]+', 1, 1) || ' ) = ( ' || regexp_substr(v_t2_fields, '[^,]+', 1, 1) || ' )
( ' || regexp_substr(v_t1_fields, '[^,]+', 1, 2) || ' ) = ( ' || regexp_substr(v_t2_fields, '[^,]+', 1, 2) || ' )
( ' || regexp_substr(v_t1_fields, '[^,]+', 1,3) || ' ) = ( ' || regexp_substr(v_t2_fields, '[^,]+', 1,3) || ' ) ';
这个也不起作用 ----ORA-01747: 无效的 user.table.column、table.column 或列规范 动态更新到动态合并 同时使用更新语句更改合并 不工作
【问题讨论】:
似乎是连接语法中的错误 - 不应该'MERGE INTO' TABLE1 || 't1' 写成'MERGE INTO' ||表1 || ' t1 ' 代替 - 在 TABLE1 之前有一个额外的 concat 运算符 你为什么要这样做?听起来像是一种糟糕的应用程序设计方法。 为了提高性能,更新 10 万条记录需要 10 分钟。所以我尝试使用合并 【参考方案1】:MERGE
语句的连接和使用很少有错误。
尝试以下动态查询:
'MERGE INTO '
|| TABLE1
|| ' t1 '
|| ' USING '
|| TABLE2
|| ' t2 '
|| ' ON ( '
|| V_CONS
|| ' ) when matched then update set '
|| REGEXP_SUBSTR(V_T1_FIELDS, '[^,]+', 1, 1)
|| ' = '
|| REGEXP_SUBSTR(V_T2_FIELDS, '[^,]+', 1, 1)
|| ', '
|| REGEXP_SUBSTR(V_T1_FIELDS, '[^,]+', 1, 2)
|| ' = '
|| REGEXP_SUBSTR(V_T2_FIELDS, '[^,]+', 1, 2)
|| ', '
|| REGEXP_SUBSTR(V_T1_FIELDS, '[^,]+', 1, 3)
|| ' = '
|| REGEXP_SUBSTR(V_T2_FIELDS, '[^,]+', 1, 3);
我假设
TABLE1
和 TABLE2
是有效的表名
V_CONS
是表格上的有效条件
V_T1_FIELDS
和 V_T2_FIELDS
包含表的有效列名
干杯!!
【讨论】:
以上是关于我想编写从更新语句到合并合并语句的动态查询的主要内容,如果未能解决你的问题,请参考以下文章
从字符串构建动态LINQ查询 - 使用Reflection?