sql - 动态 SQL 或 WITH 子句

标签 sql oracle plsql oracle11g

我一直在反复修改以下内容,试图最大限度地提高代码的可重用性,同时保持最佳性能。

我有一个非常 的 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/

相关文章:

sql - 如何在 BigQuery 中使用 table_range 函数连接表?

sql - 在 SQL 中以不同的顺序查找姓名和姓氏

sql - oracle sql left join 和 count, sum, group by

xml - 如何解析Oracle CLOB XML数据获取节点值?

sql - 从 oracle 数据库表中生成带有自定义 XML 标记的 XML 文件

mysql - 根据两列的不同组合选择最近的行

mysql - 通过多个相互关联的表进行 SQL 查询

mysql - 将当前日期或时间插入 MySQL

wcf - 如何让 Entity Framework 和 WCF 与事务一起工作?好吧……有什么 secret ?

oracle - PLSQL 中的反射(reflection)?