如何在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;
【讨论】:
是的,这是非常低效的,因为你是先循环,然后逻辑在异常块中。顺便说一句,如果声明的大小更大,使用蛮力将更加低效。VARCHAR2
在PL/SQL
中最多可以占用32767
。因此,根据您的要求,最好的方法是如我在回答中所示,使用CHAR
。【参考方案3】:
获取最大值。对于列输入,您只需执行以下操作:
SELECT MAX(LENGTH(Column))
FROM TableA;
【讨论】:
想知道这是否适用于 varchar2 声明的变量。我早上试试看。 它不起作用,因为它返回存储在该列中的实际数据的大小,而不是您可以存储在那里的数据的最大大小。它读取整个表(所有记录)来计算该值。以上是关于如何在oracle数据库中获取varchar2的声明大小的主要内容,如果未能解决你的问题,请参考以下文章
oracle数据库之如何将blob类型转换为varchar2
如何将oracle表中的字段由integer 转变为varchar2(50)