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

Ash*_*ish 5 sql oracle type-conversion oracle11g long-integer

众所周知,LONG 在 Oracle 中早已被弃用,但 Oracle 本身仍在其视图中使用这种数据类型。

因此,如果我必须将 LONG 更改为某种文本数据类型,我该如何实现这一点。

我正在尝试查询这个并收到错误。

ORA-00932: inconsistent datatypes: expected - got LONG
Run Code Online (Sandbox Code Playgroud)

询问 -

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'
Run Code Online (Sandbox Code Playgroud)

Lal*_*r B 3

有多种方法,其中一种是create table使用TO_LOB. 它旨在将 LONG 或 LONG RAW 列分别转换为 CLOB 或 BLOB。其他方法正在使用PL/SQLDBMS_XMLGEN. TO_LOB您也可以在插入语句中使用。

让我们看看如何转换LONGCLOB-

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>
Run Code Online (Sandbox Code Playgroud)

因此,我们有t一个列 ysLONG数据类型的表。

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>
Run Code Online (Sandbox Code Playgroud)

我们可以看到 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>
Run Code Online (Sandbox Code Playgroud)

现在您拥有相同的表,其中LONG列已转换为CLOB.