精华内容
下载资源
问答
  • 本文给大家分享两种方法解决Oracle两张关联批量更新其中一张数据,方法非常简单,具有参考借鉴价值,需要的的朋友参考下吧
  • 一、修改用户表table的表空间1、修改用户表table的表空间:alter table ...【脚本】查询当前用户的所有的数据表,并把表空间为“EAS_D_HFY_STANDARD”的用户表,修改为:EAS_D_HFY120929_STANDARD。/*Formattedon...

    一、修改用户表table的表空间

    1、修改用户表table的表空间:alter table 表名 move tablespace 新表空间名;

    2、查询所有用户表:select * from user_tables;

    【脚本】

    查询当前用户的所有的数据表,并把表空间为“EAS_D_HFY_STANDARD”的用户表,修改为:EAS_D_HFY120929_STANDARD。

    /* Formatted on 2012-10-11 14:17:04 (QP5 v5.115.810.9015) */

    DECLARE

    i_count   INT := 0;

    execsql   VARCHAR2 (1000);

    CURSOR c_mysql

    IS

    SELECT      'alter table  '

    || table_name

    || '  move tablespace EAS_D_HFY120929_STANDARD'

    mysql

    FROM   user_all_tables

    WHERE   tablespace_name = 'EAS_D_HFY_STANDARD';

    BEGIN

    FOR r_mysql IN c_mysql

    LOOP

    DBMS_OUTPUT.put_line (r_mysql.mysql);

    EXECUTE IMMEDIATE r_mysql.mysql;

    i_count := i_count + 1;

    END LOOP;

    DBMS_OUTPUT.put_line ('i_count: ' || i_count);

    EXCEPTION

    WHEN OTHERS

    THEN

    DBMS_OUTPUT.put_line (

    '异常:' || 'sqlcode:' || SQLCODE || ' sqlerrm : ' || SQLERRM

    );

    END;

    二、修改索引index的表空间

    【问题】

    修改表table的表空间后,在操作相关表时,遇到ORA-01502问题:

    ORA-01502: index 'HFY120401.PK_MULTIAPPROVE' or partition of such index is in unusable state

    【分析】

    1、经过系统分析,查询索引状态,可发现索引“PK_MULTIAPPROVE”的状态是“UNUSABLE”;

    2、进一步分析,发现系统中的索引index_type有3类:NORMAL、FUNCTION-BASED NORMAL、LOB,除index_type为LOB类型的索引状态为VALID外,NORMAL、FUNCTION-BASED NORMAL类型的索引状态均被设置为不可用状态了UNUSABLE。

    3、分析索引的语句如下:

    select index_name,index_type,tablespace_name,table_type,status from user_indexes;

    【脚本】

    查询当前用户所有非LOB索引,并把表空间为“EAS_D_HFY_STANDARD”的索引,更新为:EAS_D_HFY120929_STANDARD。

    /* Formatted on 2012-10-11 14:31:42 (QP5 v5.115.810.9015) */

    DECLARE

    i_count   INT := 0;

    CURSOR c_mysql

    IS

    SELECT      'alter index '

    || index_name

    || ' rebuild tablespace EAS_D_HFY120929_STANDARD'

    mysql

    FROM   user_indexes

    WHERE   tablespace_name = 'EAS_D_HFY_STANDARD' and index_type<>'LOB';

    BEGIN

    FOR r_mysql IN c_mysql

    LOOP

    DBMS_OUTPUT.put_line (r_mysql.mysql);

    EXECUTE IMMEDIATE r_mysql.mysql;

    i_count := i_count + 1;

    END LOOP;

    DBMS_OUTPUT.put_line ('i_count: ' || i_count);

    END;

    关于ORA-01502的问题,详见:《ORA-01502错误成因和解决方法》

    其实重建普通索引成功后,也试着努力更新LOB索引的,只是在详细阅读《如何重建LOB类型的索引和LOB段》后只好无奈地放弃!

    展开全文
  • oracle批量更改所有的同一字段类型。经常需要oracle中的所有的字段的类型更改为另外一个类型,可以考虑利用如下代码:此处的demo为将NVARCHAR2转为VARCHAR2类型并且字段长度保持不变。declarecursor c_tab is ...

    【oracle】批量更改所有表的同一字段类型。经常需要oracle中的所有的字段的类型更改为另外一个类型,可以考虑利用如下代码:此处的demo为将NVARCHAR2转为VARCHAR2类型并且字段长度保持不变。

    declare

    cursor c_tab is select * from user_tab_columns t where t.data_type = 'NVARCHAR2';

    r_tab user_tab_columns%rowtype;

    v_cell varchar2(100);

    sql_str varchar2(1000);

    data_length number;

    begin

    open c_tab;

    loop

    fetch c_tab into r_tab;

    exit when c_tab%notfound;

    v_cell:='';

    data_length:=trunc(r_tab.data_length/2,0);

    sql_str:='select max('||r_tab.column_name||') from '||r_tab.table_name;

    dbms_output.put_line('sql_str: '||sql_str);

    execute immediate sql_str into v_cell;

    commit;

    dbms_output.put_line('value: '||v_cell);

    dbms_output.put_line('table name: '||r_tab.table_name||' column name: '||r_tab.column_name||' length: '||r_tab.data_length);

    --1. 修改原字段名

    sql_str:='alter table '||r_tab.table_name||' rename column '||r_tab.column_name||' to temp_column';

    dbms_output.put_line('sql_str: '||sql_str);

    execute immediate sql_str;

    commit;

    --2. 添加一个和原字段同名的字段

    sql_str:='ALTER TABLE '||r_tab.table_name||' ADD '||r_tab.column_name||' VARCHAR2('||data_length||')';

    dbms_output.put_line('sql_str: '||sql_str);

    execute immediate sql_str;

    commit;

    --3. 将原来的数据更新到新字段中,这是要注意,一定要显示进行数据类型转换

    sql_str:='UPDATE '||r_tab.table_name||' SET '||r_tab.column_name||' = CAST(temp_column AS VARCHAR2('||data_length||'))';

    dbms_output.put_line('sql_str: '||sql_str);

    execute immediate sql_str;

    commit;

    --4. 删除原来的备份字段

    sql_str:='ALTER TABLE '||r_tab.table_name||' DROP COLUMN temp_column';

    dbms_output.put_line('sql_str: '||sql_str);

    execute immediate sql_str;

    commit;

    end loop;

    close c_tab;

    end;

    展开全文
  • --虚拟一张来进行操作,在数据量大的情况下效率比方法二高很多 update (select T1.Subobject_Name a1,T2.Subobject_Name b1 from T1,T2 where T1.ID=T2.ID) set a1=b1; --耗时3.234s (T1--大增大到100000...
    方法一
    写PL/SQL,开cursor
    declare
     l_varID varchar2(20);
     l_varSubName varchar2(30);
     cursor mycur is select T2.Id,T2.Subobject_Name from T2;
     
    begin
     open mycur; 
     loop
          fetch mycur into l_varID,l_varSubName;
          exit when mycur %notfound;
          update T1 set T1.Subobject_Name = l_varSubName where T1.ID = l_varID;
     end loop;
     close mycur;
    end;
    ---耗时39.716s
    显然这是最传统的方法,如果数据量巨大的话(4000万笔),还会报”snapshot too old”错误退出
     
    方法二.
    用loop循环,分批操作
    declare
     i number;
     j number;
    begin
    i := 1;
    j := 0;
    select count(*) into j from T1;
    loop
    exit when i > j;
    update T1 set T1.Subobject_Name = (select T2.Subobject_Name from T2 where T1.ID = T2.ID)
    where T1.ID >= i and T1.ID <= (i + 1000);
    i := i + 1000;
    end loop;
    end;
    --耗时0.656s,这里一共循环了10次,如果数据量巨大的话,虽然能够完成任务,但是速度还是不能令人满意。(例如我们将T1--大表增大到100000笔 T2--小表增大到50000笔
    ) 耗时10.139s
     
    方法三.
    --虚拟一张表来进行操作,在数据量大的情况下效率比方法二高很多
    update (select T1.Subobject_Name a1,T2.Subobject_Name b1 from T1,T2 where T1.ID=T2.ID)
    set a1=b1;
    --耗时3.234s (T1--大表增大到100000笔 T2--小表增大到50000笔)
     
    方法四.
    --由于UPDATE是比较消耗资源的操作,会有redo和undo操作,在这个例子里面我们可以换用下面的方法,创建一张新表,因为采用insert比update快的多,之后你会有一张旧表和一张新表,然后要怎么做就具体情况具体分析了~~~~~
    create table T3 as select * from T1 where rownum<1;
    alter table T3 nologging;
    insert /*+ APPEND */ into T3
    select T1.* from T1,T2 where T1.ID=T2.ID;
    --耗时0.398s (T1--大表增大到100000笔 T2--小表增大到50000笔)

    转载于:https://www.cnblogs.com/lowerCaseK/p/oracle_batch_update_more_table.html

    展开全文
  • oracle如何批量修改字段中的数据以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!date是Oracle保留字,居然拿来作字段名。假设这是一个文本字段,字段...

    oracle如何批量修改字段中的数据以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

    d817c714207fb2d4978ef2d379aec70d.png

    date是Oracle保留字,居然拿来作字段名。

    假设这是一个文本字段,字段名为data

    update t1 set data=to_char(to_date(data,'yyyy.mm.dd'), 'yyyymmdd')更多追问追答追问

    呵呵 date我只是打个比方 你给的语句成功了 谢谢了 麻烦再问下 如果数据是2014.8这样的情况要怎么弄追答

    那要看你想要什么结果,

    如果你想要20140801,那么

    update t1 set data=to_char(to_date(data,'yyyy.mm'), 'yyyymmdd')

    如果你想要201408,那么

    update t1 set data=to_char(to_date(data,'yyyy.mm'), 'yyyymm')追问

    非常感谢 我发现这个字段里的数据不规范 如:2014 2014.8 2014.8.27 如果是这样那又要怎么弄追答

    那你先预处理一下吧。

    按照长度判断一下缺什么内容先补上缺失部分。

    只有年的4位, 有月的是6-7位,8位及以上是全的。追问

    非常感谢

    分页:123

    展开全文
  • 需求:将所有中字段默认值为CO000002的改为CO000001 思路: 1.查找出所有表字段默认值为CO000002的字段信息(名称)
  • Oracle 批量修改数据-Merge 使用小结

    千次阅读 2017-12-21 10:04:31
    由于是批量修改接触到了Oracle的merge遇到新的知识,本人首先去了解了一下基本概念:MERGE语句是SQL语句的一种。在SQL Server、Oracle数据库中可用,MySQL、PostgreSQL中不可用。MERGE是Oracle9i新增的语法,用来...
  • 1、第一种使用循环修改表 --遍历一个并作修改 declareblvarchar(100);--声明一个字符串变量 BEGIN FORL_RECORDIN(select*fromysl_config_cywherename='机动车六年免检') --将一个对象赋值到L_RECORD变量中 ...
  • 基本概念: MERGE语句是SQL语句的一种。...通过MERGE语句,根据一张表(原数据表,source table)或子查询的连接条件对另外一张(目标表,target table)表进行查询,连接条件匹配上的进行UPDATE,...
  • 2.查询出需要修改的列 数据 3. 赋值循环变量 i in 查询出的数据 4. 赋值自定义变量 b = 想要修改的值 5. update tablename set 修改列 = 变量b where 修改列的数据 = 循环变量 i; declare b varchar2(35); begin...
  • 记录一下在Oracle下使用游标删除用户表数据 先声明游标 使用游标(循环声明的游标就行了) 先声明一个游标如下 declare cursor droptab is select * from all_tables where owner='GAO_MING'; 再循环使用...
  • 本博客介绍一下Oracle批量新增数据和更新数据的sql写法,业务场景是这样的,往一张关联表里批量新增更新数据,然后,下面介绍一下批量新增和更新的写法:批量新增数据 对于批量新增数据,介绍两种方法(1)命令窗口...
  • 4.如果有错误数据则跳过错误语句继续执行(EXCEPTION WHEN OTHERS THEN),且返回ATT :=0。 5. 当 ATT=1 时,则执行另外一个语句。 原文地址:https://www.cnblogs.com/jianshuai520/p/12912039.html
  • NULL 博文链接:https://zzx0421.iteye.com/blog/335955
  • 现在有一张数据量有十万,有一个字段是空的,现在要按数据量比例给这个字段设置三个不同的值,比如百分之三十的数据设置成1,百分之三十设置成2,剩下的百分之四十设置成3。比例无所谓不固定。 有没有大神教一下...
  • 问题:根据唯一字段编码修改其它字段,修改部分数据,数量在上万条数据数据大,一开始就卡死了!笨办法,一条一条修改不知可年可月啊。其他方法个人原因实在是无能为力。如下: update ka02_new set aka065=1,aka...
  • 这是我第一次发表博客。...vb.net和C#操作Oracle数据库已经用了N多年了。由于是做工程自动化项目的,业主只对软件的功能和界面是否友好来判定成果的好坏。所以一直都是采用直接OracleCommand.ExecuteNonQuery(sqlS...
  • oracle批量执行sql

    2015-09-22 11:43:47
    // ※只会执行sql文 不会自动删除数据 // oracleStup.bat // 命令行 用户名/密码 @库名 不需要修改 sqlplus C3/AISIN@C3 @sqlFile.sql > execute.log // sqlFile.sql // @@需要处理的sql文路径 @@D:/20150922...
  • 1.批量修改以xxx为前缀名的表名declarebeginfor vcur in (select t.TABLE_NAMEfrom user_tables twhere t.TABLE_NAME like 'xxx_%') loopexecute immediate 'drop table '...2.批量修改一张中以xxx开头的字段的值d...
  • Oracle批量修改序列值

    2021-05-03 09:32:42
    --修改数据库序列的下限 execute immediate 'alter sequence '||seq_name||' minvalue -5000'; --需要变化的数量 execute immediate 'alter sequence '||seq_name||' increment by 10000'; --给序列取下一个数 ...
  • Oracle 根据条件批量修改数据

    千次阅读 2019-10-30 16:44:15
    update ydgl.T_ZHGL_ZLBTZH t set t.yddw_code = ( select w.f_code from ydzd.T_BASE_ORG_YDDW...//条件相同则修改 where w.lj_code = t.lj_code and where.f_name = t.yddw_name ) where t.yddw_name in ( selec...
  • oracle查询与数据修改学习笔记,主要是让大家熟悉三个或四个的连接查询,熟练掌握delete、update与insert的语法。
  • Oracle批量插入UUID数据

    千次阅读 2020-04-28 14:47:22
    需求:插入一条由Oracle生成UUID的主数据,之后再插入三条子数据,子数据的父ID是主数据的ID。 --先定义四个字段,分别是主ID,以及子ID DECLARE p_id VARCHAR2 ( 50 ) := 10; m_id1 VARCHAR2 ( 50 ) := 10; m_id2...
  • Oracle高效批量插入数据

    千次阅读 2021-05-01 03:25:41
    一、准备工作建表CREATE TABLE TEMP_...)用程序拼接如下的批量插入的SQLINSERT INTO TEMP_20200210 (DMC)SELECT CD.* FROM(SELECT 1234567 FROM DUAL UNIONSELECT 1234568 FROM DUAL UNIONSELECT 1234568 FROM DU...
  • 搜到一个批量修改字段名为大写的存储过程,如下: 登陆到要修改的用户下, 执行: begin for cl in (SELECT table_name,column_name from user_tab_columns WHERE column_name<>upper(column_name) and upper...
  • 这篇文章基础是在产品投产后生产会出现问题的情况下,对于用户基数百万级别的时候,对于问题数据修改,不能一条语句全量的修改,需分段提交,存储块就能很好的解决这类问题,代码案例如下,替代脚本就可以使用,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 39,872
精华内容 15,948
关键字:

oracle批量修改表数据