`

oracle(varchar2转化clob)

阅读更多
ORA-22858: invalid alteration of datatype


由于业务的需要,今天研发同事问我在oracle里如何把table的varchar2类型转化为clob类型,其实标量类型的变量可以直接转换。


在'列'没有数据时,可以直接修改

alter table table_name modify column_name new_databyte;


在有数据的时候,可以删除和新建列或者通过一个中间列来修改原列的类型

1.

alter table table_name add column_new number;
update table_name set  column_new=column_old;
alter table table_name drop column column_old;
alter table table_name rename column  column_new to column_old;


例子:

查看现有表结构:
SQL> desc test_skate;
Name Type   Nullable Default Comments
---- ------ -------- ------- --------
NAME CLOB   Y                        
ID   NUMBER Y   

添加新列:                  
SQL> alter table test_skate add id_new varchar(50);
Table altered

备份原列值:
SQL> update test_skate set id_new=id;
1 row updated

删除原列
SQL> alter table test_skate drop column id;
Table altered

把新列重命名为原列名:
SQL> alter table test_skate rename column id_new to id;
Table altered

SQL> desc test_skate;
Name Type         Nullable Default Comments
---- ------------ -------- ------- --------
NAME CLOB         Y                        
ID   VARCHAR2(50) Y   

                   
这种方法是把新增加的字段重命名为要转换的字段,字段的顺序发生了变化,如果要求字段顺讯不变,那就还要使用
原来的字段,思路是先把现在列的数据转移到新增加的列上,然后修改原列的类型,再把数据转移回来,对原列数据
要更新两次。如果数据量比较大的话,会产生大量的undo和redo;也会产生大量的阻塞;如果想对现有系统影响最小
那就采用表在线重定义的方式

alter table table_name  add cloumn_new number;
alter table table_name  modify cloumn_old null;
update  table_name  set cloumn_new=cloumn_old,cloumn_old=null;
commit;
alter table table_name  modify cloumn_old number(10,2);
update table_name  set cloumn_old=cloumn_new,cloumn_new=null;
commit;
alter table  tb_test  drop column cloumn_new;
alter table  tb_test  modify cloumn_old not null;
select * from  tb_test ;


例子:

查看现有表结构:
SQL> desc test_skate;
Name Type          Nullable Default Comments
---- ------------- -------- ------- --------
NAME CLOB          Y                        
ID   VARCHAR2(50)  Y                        
TEXT VARCHAR2(100) Y   
                   
SQL> select * from test_skate;
NAME     ID          TEXT
----- --------------------
1       222                                               
1       222                                               
1       222                                               
1       222    
                                         
添加新列
SQL> alter table test_skate add id_new varchar(100);
Table altered

编辑原列可以为null
SQL> alter table test_skate modify id null;
alter table test_skate modify id null
ORA-01451: column to be modified to NULL cannot be modified to NULL

SQL> alter table test_skate modify id not null;
Table altered

SQL> alter table test_skate modify id null;
Table altered

把原列数据复制到新列
SQL> update test_skate set id_new=id,id=null;
4 rows updated

SQL> commit;
Commit complete

更该原列的数据类型
SQL>  alter table test_skate modify  id number;
Table altered

把新列的数据复制到原列
SQL> update test_skate set id=id_new,id_new=null;
4 rows updated

SQL> commit;
Commit complete

删除新列
SQL> alter table test_skate drop column id_new;
Table altered

编辑原列不为null
SQL> alter table test_skate modify id not null;
Table altered

查看现有结构
SQL> desc test_skate;
Name Type          Nullable Default Comments
---- ------------- -------- ------- --------
NAME CLOB          Y                        
ID   NUMBER                                 
TEXT VARCHAR2(100) Y  
                    
SQL>



但是如果要把varchar2类型转化为log类型,就要用些特殊手段了
例如:

SQL> create table test_skate
  2  (
  3    name varchar2(4000)
  4  )
  5  tablespace TBS_ARENA
  6  ;
Table created


及时表为空,也不让更改

SQL> alter table test_skate modify name clob;
alter table test_skate modify name clob
ORA-22858: invalid alteration of datatype


这里可以借助long类型过度,如果记录为空,可以直接修改为LONG类型,在从long转化为clob,对于LONG类型,不管有没有数据存在,
可以直接修改为CLOB类型

SQL> alter table test_skate modify name long;
Table altered

SQL> alter table test_skate modify name clob;
Table altered

SQL> desc test_skate;
Name Type Nullable Default Comments
---- ---- -------- ------- --------
NAME CLOB Y 
                     
对于LONG类型的转换,Oracle并不是简单的将列的定义换成CLOB,而是生成了一个临时列,将数据保存,然后删除原LONG列。
Oracle对LONG类型的转换操作进行封装,效率比用其他方法要高。


上面是在没有数据情况下, 如果有数据,和上面类似,就不测试了。



-----end-----
分享到:
评论

相关推荐

    oracle(blob转换为clob)

    `UTL_RAW.CAST_TO_VARCHAR2`是Oracle提供的一个包中的函数,用于将RAW或BLOB类型的二进制数据转换为VARCHAR2字符串类型。这一步骤对于将BLOB转换为CLOB至关重要,因为CLOB本质上是一种字符数据类型,而不能直接与二...

    ORACLE中CLOB字段转String类型

    l_substring VARCHAR2(32767); BEGIN SELECT CLOB_COLUMN INTO l_clob FROM TABLE_NAME WHERE ID = 1; l_length := DBMS_LOB.GETLENGTH(l_clob); l_substring := DBMS_LOB.SUBSTR(l_clob, 32767); -- 处理l_...

    将长于4000字符的字符串转化为CLOB类型存入数据库

    相比于VARCHAR2类型的4000字符限制,CLOB提供了更灵活、更强大的文本数据存储能力。 ### 二、转换字符串为CLOB类型的方法 #### 1. **使用Oracle.NET接口** 在C#中操作Oracle数据库通常会用到Oracle.NET接口,...

    数据库中clob类型转换的问题 数据库中clob类型转换的问题

    由于VARCHAR2的最大长度有限制(Oracle中为4000个字符),因此如果原始CLOB字段中的数据超过了VARCHAR2所能容纳的最大长度,将会导致数据丢失。 #### 解决方案1: 一种常见的解决方案是在执行此操作之前先备份原...

    oracle数据库中如何处理clob字段方法介绍

    - 将CLOB转换为VARCHAR2处理,但可能受限于VARCHAR2的最大长度。 - 先查询不含CLOB字段的记录,然后在应用程序中使用`EXISTS`或`IN`进行进一步筛选。 5. **Java操作CLOB**: - 示例代码展示了如何使用Java的反射...

    oracle-DB2.rar_oracle

    例如,Oracle的NUMBER在DB2中可能需要转化为DECIMAL,而VARCHAR2则可能需要转化为VARCHAR。 此外,两个系统在处理空值(NULL)和默认值方面也略有不同,这可能影响到数据迁移和查询编写。Oracle允许为列指定默认值...

    Oracle的表结构转成Mysql的表结构

    IF (c.data_type = 'VARCHAR2' OR c.data_type = 'NVARCHAR2') THEN data_type := 'VARCHAR(' || c.data_length || ')'; ELSIF (c.data_type = 'CHAR' OR c.data_type = 'NCHAR') THEN data_type := 'CHAR(' || ...

    Mysql转oracle工具

    例如,MySQL的`VARCHAR2`对应Oracle的`VARCHAR2`,但MySQL的`TINYINT`在Oracle中可能是`NUMBER(3)`,`BLOB`和`CLOB`在两个系统中都有,但处理方式不同。 3. **对象权限和安全模型**: MySQL的权限管理相对简单,而...

    Oracle P/L SQL实现发送Email、浏览网页等网络操作功能

    --Clob叠加比较慢,先用VarChar2叠加到4000个字符后才叠加到Clob字段 --UTL_INet.p_ClobCAT( Procedure p_ClobCAT( ac_HTMLText in Out Clob, as_CatText in Out VarChar2, as_Str in VarChar2 ...

    Oracle数据库第2讲.ppt

    在Oracle数据库第2讲中,主要探讨了数据库服务器、数据库和表的基本概念,以及数据在数据库中的存储方式,同时介绍了如何创建表以及Oracle数据库中常用的数据类型。 首先,数据库服务器是安装在计算机上用于管理多...

    groovy将JDBC中oracle存储过程游标转换为多层json

    as_xml_mark IN VARCHAR2 ) RETURN VARCHAR2 IS vs_bmark VARCHAR2(64); vs_emark VARCHAR2(64); vs_source VARCHAR2(10240); vs_xmlval VARCHAR2(10240); vi_bpos INTEGER; vi_epos INTEGER; BEGIN vs_...

    Oracle数据库第2讲.pptx

    数据在数据库中的存储方式通常是以表格的形式,比如在User对象的例子中,每个User对象的数据会被转化为一行记录,包括id(int类型)、name(字符串类型)和age(整数类型)。列名是字段名,而数据类型则决定了该字段...

    Oracle字符集的查看和修改.pdf

    - **数据库字符集**:在创建数据库时指定,用于存储CHAR、VARCHAR2、CLOB、LONG等类型的数据,以及标识表名、列名和PL/SQL变量。一旦创建,通常不建议更改。 - **国家字符集**:在Oracle9i之后引入,用于存储NCHAR...

    Oracle XML数据库实验

    SELECT xml_column, XMLTable('/root/element' PASSING xml_column COLUMNS new_value VARCHAR2(100) PATH 'text()') FROM table_name ) SET new_value = 'New Value'; ``` 五、XML索引 为了提高XML查询性能,...

    Oracle数据库经典学习教程v1.doc

    - **Oracle数据类型**:Oracle支持多种数据类型,如数值类型(NUMBER)、字符类型(VARCHAR2、CHAR)、日期时间类型(DATE)、二进制数据类型(BLOB、CLOB)等。 - **建立概念模型**:在设计数据库时,首先构建...

    Oracle数据库学习日记

    - 示例: `create table employees (id NUMBER(5), name VARCHAR2(50));` - **添加一个字段**: 使用 `alter table` 命令。 - 示例: `alter table employees add (email VARCHAR2(100));` - **修改字段的长度**: ...

    oracle函数大全.doc

    SQL> select instr('oracle traning','ra',1,2) instring from dual; INSTRING --------- 9 6.LENGTH 返回字符串的长度; SQL> select name,length(name),addr,length(addr),sal,length(to_char(sal)) from gao.nchar...

    Timesten内存数据库与Json数据转换

    FUNCTION getJsonValueCom(pj_clob CLOB, param VARCHAR2) RETURN VARCHAR2; -- 其他函数省略... END PK_TT_JSON; ``` #### 使用案例 1. **根据Key获取JSON的值**:假设有一个名为`user_info`的JSON字符串,...

    Oracle数据库学习日记-实用性最强的Oracle学习总结.docx

    - 示例:`CREATE TABLE MY_TABLE (ID NUMBER, NAME VARCHAR2(50));` ##### 4.2 添加一个字段 - 使用 `ALTER TABLE` 语句可以添加新字段。 - 示例:`ALTER TABLE MY_TABLE ADD AGE NUMBER;` ##### 4.3 修改字段...

Global site tag (gtag.js) - Google Analytics