oracle display_raw 用于 varchar 大小超过 32
Posted
技术标签:
【中文标题】oracle display_raw 用于 varchar 大小超过 32【英文标题】:oracle display_raw for varchar size more than 32 【发布时间】:2017-09-08 09:37:11 【问题描述】:我正在尝试使用以下 SQL 获取 oracle 表字段的高值和低值:
select display_raw(a.low_value,b.data_type) as low_val, display_raw(a.high_value,b.data_type) as high_val
from
all_tab_col_statistics a, all_tab_cols b
where
a.owner=b.owner and a.table_name=b.table_name and a.column_name=b.column_name;
当列类型为 VARCHAR2 时,上面的 SQL 只有在存储的字符串大小 32,则 display_raw 返回 null。
进一步调查发现 display_raw 仅支持大小小于 32 的 VARCHAR2。 https://github.com/gregrahn/oracle-scripts/blob/master/display_raw.sql
这背后有什么原因吗?以及如何克服这个问题并为长度超过 32 的字符串显示低值和高值?
感谢任何帮助。
【问题讨论】:
32K 是 Oracle 对 varchar2 长度的限制。 但它不适用于大小超过 32 个字符的字符串。 抱歉,误读了。您链接中的代码将几个变量限制为 32 个字符。不确定该函数的作用。 【参考方案1】:你能增加函数中 cv,cnv abd cc 变量的大小吗? 见下面的代码
--
-- display_raw.sql
--
-- DESCRIPTION
-- helper function to print raw representation of column stats minimum or maximum
--
-- Created by Greg Rahn on 2011-08-19.
--
create or replace function display_raw (rawval raw, type varchar2)
return varchar2
is
cn number;
cv varchar2(8192);
cd date;
cnv nvarchar2(8192);
cr rowid;
cc char(2000);
cbf binary_float;
cbd binary_double;
begin
if (type = 'VARCHAR2') then
dbms_stats.convert_raw_value(rawval, cv);
return to_char(cv);
elsif (type = 'DATE') then
dbms_stats.convert_raw_value(rawval, cd);
return to_char(cd);
elsif (type = 'NUMBER') then
dbms_stats.convert_raw_value(rawval, cn);
return to_char(cn);
elsif (type = 'BINARY_FLOAT') then
dbms_stats.convert_raw_value(rawval, cbf);
return to_char(cbf);
elsif (type = 'BINARY_DOUBLE') then
dbms_stats.convert_raw_value(rawval, cbd);
return to_char(cbd);
elsif (type = 'NVARCHAR2') then
dbms_stats.convert_raw_value(rawval, cnv);
return to_char(cnv);
elsif (type = 'ROWID') then
dbms_stats.convert_raw_value(rawval, cr);
return to_char(cr);
elsif (type = 'CHAR') then
dbms_stats.convert_raw_value(rawval, cc);
return to_char(cc);
else
return 'UNKNOWN DATATYPE';
end if;
end;
/
【讨论】:
但这是 Oracle 中的一个函数,不是我定义的。 这是来自链接github.com/gregrahn/oracle-scripts/blob/master/display_raw.sql的函数 - 没有复杂的逻辑,所以,只需复制函数源代码,稍作改动并重新编译即可 同意。我已经尝试过了,它有效。但我认为限制字符的背后应该有一些意图。以上是关于oracle display_raw 用于 varchar 大小超过 32的主要内容,如果未能解决你的问题,请参考以下文章