Oracle动态SQL疑问:v_sql内容及多CLOB字段拼接可行性
Oracle新手问题解答
先搞懂v_sql里存的是什么
你原来的这段代码:
SELECT 'select distinct mi.*, v.pa_id, v.agent from ( ' || view_source INTO v_sql FROM tablename1 WHERE pk_pid = p_Process;
会把一段拼接好的SQL开头部分存进v_sql里,具体是:
- 固定前缀字符串:
select distinct mi.*, v.pa_id, v.agent from ( - 加上
tablename1表中pk_pid等于输入参数p_Process的那一行里,view_source列存储的CLOB类型SQL内容
之后执行后续拼接代码后,v_sql会变成一个完整的可执行SQL,结构大概是这样:
select distinct mi.*, v.pa_id, v.agent from ( -- 这里是view_source列里的SQL语句内容 ) mi join ta_people_suppliers ps on (ps.id = '你传入的p_requestor值' and ps.supplierid = mi.supplierid ) join ta_people_states s on (s.id = ps.id and s.perspective = 'MAKE') join vw_items_people v on (v.pk_itemid = mi.pk_itemid) where mi.state = s.state
怎么把两个CLOB列拼进v_sql里
你写的union view_source_process写法不对,这里是在拼接字符串(CLOB),不是在SQL查询里做UNION操作。正确的做法是用' UNION '字符串把两个CLOB列连接起来,Oracle支持用||拼接CLOB类型。
修改后的代码应该是这样:
SELECT 'select distinct mi.*, v.pa_id, v.agent from ( ' || view_source || ' UNION ' || view_source_process INTO v_sql FROM tablename1 WHERE pk_pid = p_Process;
这样拼接后,v_sql的开头部分就会包含两个CLOB里的SQL,用UNION合并,后续再拼接上你原来的连接和条件语句,形成完整的查询。
要注意的点
- 必须保证
view_source和view_source_process里的SQL查询返回的列数、列数据类型完全匹配,不然UNION会报错。 - 如果不需要去重,用
UNION ALL代替UNION,查询效率更高。 - 确认
v_sql的变量类型是CLOB,别用VARCHAR2——因为VARCHAR2有长度限制,拼接大内容会截断报错。
内容的提问来源于stack exchange,提问作者Chandu
相关产品推荐
相关产品推荐

