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)
有多种方法,其中一种是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>
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.