2

PL/SQL 变量的声明需要为类似varchar2的类型设置长度:

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;
4

2 回答 2

5

CLOB如果您想在 SQL 中操作大于 4000 字节或在 PL/SQL 中大于 32 kB 的字符串,则数据类型是您唯一真正的选择。

虽然 on 的操作CLOBVARCHAR2小字符串的操作要贵一些,所以你应该只CLOB在处理大字符串时使用数据类型。因此VARCHAR2数据类型仍然有它的用途,不要过度使用 CLOB 替换所有字符串。

于 2013-07-01T15:35:29.750 回答
1

查看您的示例工作代码,我了解您想要动态生成一个视图定义,该定义可能由数百个联合语句组成,每个语句都查询不同的表。

类似的数据存储在数百个不同的表中!现在那是一个奇怪的数据库架构!

无论如何,从性能的角度来看,不建议盲目地用 clob 替换 varcar2。

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

然后,您可以为该计数器最佳选择一个值,在该值之上您可以使用 clob 数据类型,在该值之下使用 varchar2 数据类型。

于 2013-07-02T08:44:38.890 回答