日期:2014-05-17  浏览次数:20947 次

ORACLE存储过程,参数字符串太长
在做存储过程开发的时候,需要拼SQL语句,比如
DECLARE
V_SQL VARCHAR2(32000);
BEGIN
V_SQL := 'INSERT INTO TB_TA(COUNTER0001,COUNTER0002.......COUNTER1000)
SELECT 
公式1,
公式2,
......
公式10000
from 
TB_BASE BASE
LEFT JOIN TB_COUNTER0001 T0001 ON T0001.A = BASE.A
LEFT JOIN TB_COUNTER0002 T0002 ON T0002.A = BASE.A
......
LEFT JOIN TB_COUNTER1000 T1000 ON T1000.A = BASE.A';
EXECUTE IMMEDIATE V_SQL;
COMMIT;
END;

但是这个SQL语句很大很大,绝对的超过了32767限制,而且就算拆成小段也会超过,比如这么拆:
DECLARE
V_INSERT VARCHAR2(32000);
V_FORMATE VARCHAR2(32000);
V_TABLE VARCHAR2(32000);
BEGIN
V_INSERT := '(COUNTER0001,COUNTER0002.......COUNTER1000)';

V_FORMATE := '公式1,公式2,......公式10000';

V_TABLE := '
LEFT JOIN TB_COUNTER0001 T0001 ON T0001.A = BASE.A
LEFT JOIN TB_COUNTER0002 T0002 ON T0002.A = BASE.A
......
LEFT JOIN TB_COUNTER1000 T1000 ON T1000.A = BASE.A';

EXECUTE IMMEDIATE 'INSERT INTO TB_TA' || V_INSERT ||
'SELECT'||
V_FORMATE || 
'from 
TB_BASE BASE' || V_TABLE;
EXECUTE IMMEDIATE V_SQL;
COMMIT;
END;

V_FORMATE就已经超过了,现在已经不知所措,问问大侠有没有方法可以解决。
我自己有个设想,就是把这些丢到BOLB里面去,
然后写一个函数FUN_BOOLTOVARCHAR2,
然后执行
EXECUTE IMMEDIATE FUN_BOOLTOVARCHAR2(BOLB_SQL);
COMMIT;
但是不知道可行性怎么样?
请各位大侠看看!
拜谢!!


------最佳解决方案--------------------
1 CLOB就可以了

2 长SQL面临解析的问题,不是存个字符串就能搞定的。
------其他解决方案--------------------
引用:
1 CLOB就可以了

2 长SQL面临解析的问题,不是存个字符串就能搞定的。

大侠 
可以直接
DECLARE 
CLOB_SQL CLOB;
BEGIN
EXECUTE IMMEDIATE CLOB_SQL;
END;

这样么?
没有用过CLOB。。。
------其他解决方案--------------------
好吧 问题已经解决了 谢谢