PL/SQL变量的声明要求设置长度VARCHAR2像类型:当你试图避免在字符串长度中使用魔术数字时,是否使用PL/SQL代码中的错误练习的clob类型?
declare
query varchar2(2000);
begin
for i in 1..100 loop
query := query || to_char(i);
end loop;
dbms_output.put_line(query);
end;
/
我在陷阱当产品要求的变化,以便循环范围变大运行(设定范围1..1000在我例如),我得到了错误:
ORA-06502: PL/SQL: : буфер символьных строк слишком маленький ошибка числа или значения ORA-06512: на line 5
所以我需要增加查询长度无处不在,甚至与一些较大数量的谓词的未来。
这很难看。我不是PL/SQL的专家,但通过阅读官方文档,我发现clob类型,它不需要长度和快速检查显示我的代码工作!
PL/SQL代码变得更像Pascal,更像Python/Ruby/Perl。我很喜欢。
我只对动态构建的字符串应用了类型转换,这些字符串没有使用密集的循环。
这样的技术是正确的还是我错了?
PS我大一PL/SQL编程所以问这样愚蠢的问题...
PPS一个工作代码(简化):
queryStr := 'create or replace view "DATA_VIEW" ("DT", "MONEY", "EVENT") as (';
for eventRec in eventCur
loop
queryStr := queryStr || 'select DT, MONEY, ' || eventRec.ID
|| ' EVENT from ' || eventRec.tbl || ' union ';
end loop;
queryStr := rtrim(queryStr, ' union ') || ')';
execute immediate queryStr;
commit;
在PL/SQL最大将VARCHAR2(32767)的值。如果你生成的动态查询大于这个,我可能会完全问你的方法。 Clobs可以在技术上拯救你,但我想看看那个查询看起来像什么! – tbone
@tbone因此,要以defencive的方式,我只需要声明每个不可预知的长度** VARCHAR2 **为32767字节长? – gavenkoa
@tbone我使用这种可变长度的字符串来创建动态查询,以便它们脱离任何循环并且没有性能问题(如果您与表格行上的循环进行比较)... – gavenkoa