ORACLE存储过程,参数字符串太长

时间:2021-08-31 10:21:50
在做存储过程开发的时候,需要拼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;
但是不知道可行性怎么样?
请各位大侠看看!
拜谢!!

5 个解决方案

#1


1 CLOB就可以了

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

#2


引用 1 楼 forgetsam 的回复:
1 CLOB就可以了

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

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

这样么?
没有用过CLOB。。。

#3


好吧 问题已经解决了 谢谢

#4


您好!请问字符串过长问题怎么解决的?是BLOB还是把TAble作为参数?非常感谢!

#5


clob 也是有长度限制的

#1


1 CLOB就可以了

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

#2


引用 1 楼 forgetsam 的回复:
1 CLOB就可以了

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

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

这样么?
没有用过CLOB。。。

#3


好吧 问题已经解决了 谢谢

#4


您好!请问字符串过长问题怎么解决的?是BLOB还是把TAble作为参数?非常感谢!

#5


clob 也是有长度限制的