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的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 查询(框架)

Oracle 销售统计报表 实例

在Oracle中将1传递给游标时指定可变大小

异常后停止 PL/SQL 代码(PL/SQL、ORACLE)

Oracle游标

oracle学习_基本语法