[英]Problem with a ORACLE LONG datatype field when searching for it with JPA
[英]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_VIEWS
或DBA_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.