2013-07-01 27 views
2

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; 
+2

在PL/SQL最大将VARCHAR2(32767)的值。如果你生成的动态查询大于这个,我可能会完全问你的方法。 Clobs可以在技术上拯救你,但我想看看那个查询看起来像什么! – tbone

+0

@tbone因此,要以defencive的方式,我只需要声明每个不可预知的长度** VARCHAR2 **为32767字节长? – gavenkoa

+0

@tbone我使用这种可变长度的字符串来创建动态查询,以便它们脱离任何循环并且没有性能问题(如果您与表格行上的循环进行比较)... – gavenkoa

回答

4

CLOB数据类型是你的如果你想操纵SQL中大于4000字节的字符串或PL/SQL中的32 kB字符串,那么只有真正的选项。

CLOB的操作比上VARCHAR2为小弦,虽然有点贵,所以用大串打交道时,你应该只使用CLOB数据类型。因此,VARCHAR2数据类型仍然有其用处,不要过分用CLOB替换所有的字符串。

+0

请注意,我不会用CLOB替换每个VARCHAR2。我的主要观点是为动态构建字符串设置固定长度(其长度取决于数据内容,而不是DDL)是丑陋的......无论如何感谢您的兴趣+1 – gavenkoa

1

看着你的示例工作代码,我的理解是你想动态生成一个由大约数百个联合语句组成的视图定义,每个联合语句查询不同的表。

存储在数百个不同表格中的相似数据!现在这是一个奇怪的数据库架构!反正,只是一味的用clob替换varcar2并不是从性能的角度来推荐的。

为什么不保留计数器/检查'eventCur'(eventRec)中的记录数?

然后你可以选择最佳的为柜台上方,你可以使用CLOB数据类型,并可以在低于该VARCHAR2数据类型..

+0

感谢您对问题的兴趣。 +1。我肯定必须突出** ** clob **字符串的任何扩展循环)) – gavenkoa

相关问题