我一直在反复修改以下内容,试图最大限度地提高代码的可重用性,同时保持最佳性能。
我有一个非常 的 SQL 查询长而复杂 ,我试图多次运行(准确地说是 6 次),每次都使用不同的 WHERE CLAUSE。花了很多功夫才把它变成我可以交换 WHERE CLAUSE 的形式……但是我在为每种情况运行查询时遇到了很多困难。
即>
INSERT INTO table_x (SELECT *
FROM mst_q (+300 lines query)
WHERE complex_where_clause_1);
INSERT INTO table_x (SELECT *
FROM mst_q (+300 lines query)
WHERE complex_where_clause_2);
我试过使用
UNION ALL
, WHERE with CASE
, WHERE with OR
,甚至想到了 6 个不同的 CURSORS
这将独立插入 6 个案例中的每一个的结果。 有 6 个不同的 CURSORS 工作,性能很棒,重复代码太多 ,因为所有变化都是 WHERE
条款。我想,太好了,dynamic SQL !但是“长而复杂的”语句比
VARCHAR2
的大小要大得多。 .有没有办法做类似下面的事情?这是我能想到的最简单的选项,唯一的问题是 v_sql 肯定会比
VARCHAR2
的大小限制更长。 .v_sql := 'INSERT INTO table_x (col1, col2) SELECT col1, col2 FROM WHERE ';
v_scen1 := 'complex_where_clause_1';
v_scen2 := 'complex_where_clause_2'
EXECUTE IMMEDIATE v_sql || v_scen1;
EXECUTE IMMEDIATE v_sql || v_scen2;
最佳答案
...啊,太简单了,直接用:v_sql CLOB;
我将在几个小时内详细说明;但如果可能的话,我能够完全按照我的要求去做...使用 CLOB
打破 VARCHAR2
的大小限制,我只是简单地附加 WHERE
子句并按顺序执行...
关于sql - 动态 SQL 或 WITH 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25254279/