众所周知,LONG在Oracle中被弃用了很长时间,但Oracle本身仍然在他们的视图中使用这种数据类型。
因此,如果我必须将LONG更改为某种文本数据类型,我该如何实现。
我正在尝试查询并收到错误。
ORA-00932: inconsistent datatypes: expected - got LONG
查询 -
SELECT NVL(ie.column_expression, ic.column_name)
from user_ind_columns ic left join user_ind_expressions ie on ic.index_name = ie.index_name and ic.table_name = ie.table_name
where ic.table_name = 'Some Table'
答案 0 :(得分:3)
有几种方法,一种方法create table
使用TO_LOB
。它旨在将LONG或LONG RAW列分别转换为CLOB或BLOB。其他方法正在使用PL/SQL
,DBMS_XMLGEN
。您还可以在插入语句中使用TO_LOB
。
让我们看看如何将LONG
转换为CLOB
-
SQL> CREATE TABLE t (x INT, y LONG);
Table created.
SQL>
SQL> INSERT INTO t VALUES (1, RPAD('*',9,'!'));
1 row created.
SQL> INSERT INTO t VALUES (2, RPAD('*',9,'@'));
1 row created.
SQL> INSERT INTO t VALUES (3, RPAD('*',9,'#'));
1 row created.
SQL> COMMIT;
Commit complete.
SQL>
因此,我们的表格t
包含y s LONG
列数据类型。
SQL> CREATE TABLE t1
2 AS
3 SELECT * FROM t
4 /
SELECT * FROM t
*
ERROR at line 3:
ORA-00997: illegal use of LONG datatype
SQL>
我们可以看到LONG限制。
让我们使用TO_LOB
将其转换为CLOB
。
SQL> CREATE TABLE t1
2 AS
3 SELECT x,
4 to_lob(y) as y
5 FROM t
6 /
Table created.
SQL> desc t1;
Name Null? Type
----------------------------------------------------- -------- ------------------------------------
X NUMBER(38)
Y CLOB
SQL>
现在,您将LONG
列转换为CLOB
的表格相同。
答案 1 :(得分:1)
这是愚蠢的(可能效率不高),但它适用于y的长度(即<2000个字符)..
CREATE TABLE t (x INT, y LONG);
INSERT INTO t VALUES (1, RPAD('*',9,'!'));
CREATE TABLE t1
AS
SELECT x,
regexp_substr(SYS.DBMS_XMLGEN.GETXML('select y from t where rowid = '''||rowid||''''),'<Y>(.*)</Y>',1,1,'in',1) y
FROM t
/
它的工作原理是使用dbms_xmlgen根据LONG列生成clob ..然后将值重新输出。
这仅适用于LONG列的小内容。但这就是我所拥有的,这对我有用。
答案 2 :(得分:0)
我有类似的需求,需要列出对象及其大小(包括索引中使用的列的信息),并提供了以下解决方案:
select idx1.table_owner owner, idx1.table_name, idx1.index_name, listagg(nvl(idx1.column_expression,idx1.column_name),',') within group (order by idx1.column_position) column_name
from xmltable(
'/ROWSET/ROW'
passing (select dbms_xmlgen.getxmltype('select ic.table_owner, ic.table_name, ic.index_name, ic.column_position, ic.column_name, ie.column_expression
from all_ind_columns ic
left outer join dba_ind_expressions ie on ie.table_owner=ic.table_owner and ie.table_name=ic.table_name and ie.index_name=ic.index_name and ie.column_position=ic.column_position') from dual)
columns index_name varchar2(30) path 'INDEX_NAME'
, table_owner varchar2(30) path 'TABLE_OWNER'
, table_name varchar2(30) path 'TABLE_NAME'
, column_position number path 'COLUMN_POSITION'
, column_name varchar2(30) path 'COLUMN_NAME'
, column_expression varchar2(4000) path 'COLUMN_EXPRESSION') idx1
group by idx1.table_owner, idx1.table_name, idx1.index_name