如何在oracle数据库中获取varchar2的声明大小

Posted

技术标签:

【中文标题】如何在oracle数据库中获取varchar2的声明大小【英文标题】:How to get the declared size of a varchar2 in oracle database 【发布时间】:2015-08-18 10:18:31 【问题描述】:

试图获取 Oracle 中已定义变量的大小。在声明 varchar2 的大小时,我可能需要使用一个数字,但宁愿不必跟踪额外的变量或数字。

示例伪代码:

declare 
  myvar varchar(42) := 'a';
begin

  /* I know the length is length(myvar) = 1. */
  /* but how do I get 42? */
  /* What is the max defined size of this variable */
  declared_size_of(myvar);  
end

我需要这个的原因是将字符串的长度填充到声明的大小,这样它就不会产生异常。

【问题讨论】:

我不认为你可以。只需声明一个常量并继续。 @OldProgrammer,有没有什么办法可以使用常量来声明变量的大小? 这里有更多的上下文可能会有所帮助。这段代码真的会在匿名块中运行,还是会成为对象的一部分?如果它是一个对象,那么 PL/Scope 可能会告诉你变量的大小,如果你知道变量的确切来源。但是,如果您知道变量的来源,为什么不直接对数字进行硬编码呢?如果你不知道变量从哪里来,你可能会被困在编写一个递增的循环,直到出现异常,然后处理异常。 为什么非填充字符串会产生异常?这似乎是一个应该在其他地方修复的错误。如果需要填充字符串,鉴于 char(x) 变量的语义总是被填充到适当的长度,如果你真的需要填充字符串,为什么不使用 char 而不是 varchar2 ? 你真的有例外吗?或者你只是认为你可以?请发布实际的异常消息。 【参考方案1】:

正如@Justin 在他的 cmets 中所说,如果您使用 CHAR 数据类型,则不必显式地空白填充字符串。 Oracle 会将值填充为最大大小。

来自documentation,

如果接收者的数据类型是 CHAR,PL/SQL 将值填充空白 到最大尺寸。有关原件中尾随空格的信息 价值丢失。

例如,

SQL> SET serveroutput ON
SQL> DECLARE
  2    myvar CHAR(42);
  3  BEGIN
  4    myvar:='a';
  5    dbms_output.put_line(LENGTH(myvar));
  6  END;
  7  /
42

PL/SQL procedure successfully completed.

SQL>

【讨论】:

【参考方案2】:

使用异常处理的蛮力技术可能非常低效:

 DECLARE
   myvar varchar2(42) := 'a'; /* using varchar */
   v_size number := null;
   x varchar(4000) := '';
   v_length number := 0;
   BEGIN
     begin
        v_length := length(myvar);
        x := myvar;
        FOR i in v_length..8001 LOOP
           myvar := myvar || ' '; /* add one space at a time until it causes an exception */
        End Loop;   
        EXCEPTION
           -- WHEN NO_DATA_FOUND THEN
              WHEN OTHERS THEN
                v_length := length(myvar);
     end;
     dbms_output.put_line('Declared size is varchar('||v_length
                          ||') and length(myvar) is '||length(trim(myvar)));
   END;

【讨论】:

是的,这是非常低效的,因为你是先循环,然后逻辑在异常块中。顺便说一句,如果声明的大小更大,使用蛮力将更加低效。 VARCHAR2PL/SQL 中最多可以占用32767。因此,根据您的要求,最好的方法是如我在回答中所示,使用CHAR【参考方案3】:

获取最大值。对于列输入,您只需执行以下操作:

SELECT MAX(LENGTH(Column)) 
FROM TableA;

【讨论】:

想知道这是否适用于 varchar2 声明的变量。我早上试试看。 它不起作用,因为它返回存储在该列中的实际数据的大小,而不是您可以存储在那里的数据的最大大小。它读取整个表(所有记录)来计算该值。

以上是关于如何在oracle数据库中获取varchar2的声明大小的主要内容,如果未能解决你的问题,请参考以下文章

oracle数据库之如何将blob类型转换为varchar2

oracle中两个varchar2类型的时间怎么进行比较

如何将oracle表中的字段由integer 转变为varchar2(50)

oracle中怎样修改varchar2字段为clob字段

Oracle 过程 'out' 'table of varchar2' 类型参数

oracle 中比较日期大小,日期定义的是varchar2类型的,比如'2011-10-21'