将LONG转换为VARCHAR2或某些text数据类型

时间:2015-01-08 07:36:41

标签: sql oracle oracle11g long-integer type-conversion

众所周知,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'

3 个答案:

答案 0 :(得分:3)

有几种方法,一种方法create table使用TO_LOB。它旨在将LONG或LONG RAW列分别转换为CLOB或BLOB。其他方法正在使用PL/SQLDBMS_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