繁体   English   中英

在Oracle中搜索LONG数据类型

[英]Searching LONG datatype in Oracle

我正在寻找一种搜索具有LONG数据类型的列的方法。

我知道它们已被弃用(并且我一直讨厌与它们一起使用...),但是由于某种原因,Oracle自己继续在自己的表和视图中使用它们...

基本上,我想使用WHERE子句在SYS.USER_TAB_SUBPARTITIONS上构建查询,以过滤特定的HIGH_VALUE

HIGH_VALUE具有LONG数据类型,而我知道过滤这些内容的唯一方法是使用未dbms_metadata_util.long2varchar函数dbms_metadata_util.long2varchar

但是,使用此函数执行查询时,返回值为NULL。

select sys.dbms_metadata_util.long2varchar(2000,'SYS.USER_TAB_SUBPARTITIONS','HIGH_VALUE', rowid) from USER_TAB_SUBPARTITIONS;

这很可能是因为USER_TAB_SUBPARTITIONS实际上不是表,而是视图。 而且视图没有rowids ...

但是,这似乎是一种奇怪的观点,因为其定义未显示任何基础表。 相反,它只是在自身上创建同义词。

因此,对于我的实际问题:还有其他查询LONG的方法吗? 有人知道USER_TAB_SUBPARTITIONS的“基本表”吗?

如果查询ALL_VIEWSDBA_VIEWS ,则将找到视图USER_TAB_SUBPARTITIONS的定义

SELECT TEXT
  FROM all_views
 WHERE view_name = 'USER_TAB_SUBPARTITIONS';

您将看到HIGH_VALUE来自sys.tabsubpart$ hiboundval列。

我们还可以使用另一种方法来提取HIGH_VALUE 您可以使用SUBSTR()从提取的HIGH_VALUE提取确切的值。

DECLARE
v_high_value VARCHAR2(100);
BEGIN
SELECT EXTRACTVALUE (
          DBMS_XMLGEN.GETXMLTYPE (
                'SELECT high_value                                                                    
FROM all_tab_partitions                                                                   
WHERE partition_name='''
             || YOUR_PARTITION_NAME
             || '''                                                                     
AND table_owner='''
             || YOUR_TABLE_OWNER
             || '''                                                                     
AND table_name='''
             || YOUR_TABLE
             || ''''),
          'ROWSET/ROW/HIGH_VALUE') INTO v_high_value
  FROM DUAL;

END;
/

您可以在此处参考“ 询问TOM”文章

是的,Oracle System-Views中的数据类型LONG很麻烦。 当我必须使用这些值时,请使用以下值:

DECLARE
    high_value INTEGER;
BEGIN
    FOR aPart IN (SELECT * FROM USER_TAB_SUBPARTITIONS) LOOP
        EXECUTE IMMEDIATE 'BEGIN :ret := '||aPart.HIGH_VALUE||'; END;' USING OUT high_value;

        SELECT ...
        WHERE ... = high_value;

    end loop;

END;

注意,在此示例中, HIGH_VALUE是整数值。 但是,也可以是其他任何内容(例如,TIMESTAMP),请在您的过程中考虑这一点。 例如这样:

FUNCTION IntervalType(tableName IN VARCHAR2) RETURN VARCHAR2 IS

    EXPRESSION_IS_OF_WRONG_TYPE EXCEPTION;
    PRAGMA EXCEPTION_INIT(EXPRESSION_IS_OF_WRONG_TYPE, -6550);

    ds INTERVAL DAY TO SECOND;
    ym INTERVAL YEAR TO MONTH;
    str VARCHAR2(1000);

BEGIN

    SELECT INTERVAL
    INTO str 
    FROM USER_PART_TABLES 
    WHERE TABLE_NAME = tableName;

    EXECUTE IMMEDIATE 'BEGIN :ret := '||str||'; END;' USING OUT ym;
    RETURN 'YEAR TO MONTH Interval of '||ym;

EXCEPTION 
    WHEN EXPRESSION_IS_OF_WRONG_TYPE THEN
        EXECUTE IMMEDIATE 'BEGIN :ret := '||str||'; END;' USING OUT ds;
        RETURN 'DAY TO SECOND Interval of '||ds;

END IntervalType;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM