【问题标题】:Is there a way to automatically declare a varchar2 constant with the needed size?有没有办法自动声明具有所需大小的 varchar2 常量?
【发布时间】:2015-06-30 13:55:36
【问题描述】:

有没有办法声明一个具有所需大小的 varchar2 常量?

例如我希望有以下定义,而不必在括号中明确声明大小:

c_my_string constant varchar2(3) := 'abc';

有没有办法做类似的事情:

c_my_string constant varchar2(sizeof('abc')) := 'abc';

除此之外,我当然可以将常量定义为原始常量,然后使用 UTL_RAW.CAST_TO_VARCHAR2(my_raw); 即时将其转换为 varchar2

【问题讨论】:

  • 这并不比你的第一行更短/更简单......为什么你想让声明比它真正需要的更复杂?
  • 只有当常量与表列相关时,才可以设置最大大小,不能设置实际大小。为什么对硬编码字符串的长度进行硬编码是个问题?
  • 这会很懒,但你可以使用c_my_string long := 'abc';。请注意,PL/SQL 中的long 只是varchar2(32760) 的简写。
  • 该引用似乎已被删除最新的 11g 文档和 12c 文档。 This might be useful though; 似乎这不再是 11gR2 的问题,而且您不会在示例中“浪费”这 9 个字节。不过测试结果可能很有趣。
  • 您是否有内存/性能测试用例表明这是您的应用程序中的一个问题? PL/SQL 是一种相当高级的语言,AFAIK PL/SQL 编译器/运行时会自动处理所有内存预留。

标签: oracle plsql


【解决方案1】:

我想您可以使用本地函数,然后像引用变量一样引用它:

declare
  function f_my_string return varchar2 is
  begin
    return 'abc';
  end;
begin
  dbms_output.put_line(f_my_string);
end;
/

不知道为什么你想让它变得那么复杂。

【讨论】:

  • 用clob代替varchar2怎么样?
  • @Roland - CLOB 不是会更多 占用大量内存吗?我认为对于短字符串来说开销会更高,但我想这是另一个有趣的测试。
  • 我认为你是对的。我没有检查它,但我读了一篇 SO 帖子说明了这一点。
  • 考虑到问题似乎真的是关于内存使用和字符编码,而且从 11gR2 开始您似乎不需要担心它(反正不是您真的需要),这甚至比我最初想象的更无意义和不必要的复杂 *8-)
  • 请考虑,如果您的数据库是 utf8,那么 varchar2(3 char) 将保留 12 个字节,即使您只在其中存储常量“abc”(3 个字节就足够了)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-25
  • 1970-01-01
  • 1970-01-01
  • 2013-12-21
  • 2020-11-05
相关资源
最近更新 更多