Oracle中循环遍历从一个表中查出30W数据,并插入另一个表.我用了4个多小时,求问怎样优化?

作者&投稿:尔育 (若有异议请与网页底部的电邮联系)
遍历oracle中得一个表,取出每一列的“name”值。再查出关联这个“name”值的~

declare
teacher_name varchar(20)------------跟teacher表中老师名字类型保持一致
cursor t_name is select teachername from teacher---------申明游标t_name为从teacher表中查询老师名字
begin
open t_name;------打开游标t_name
loop-------开始循环(遍历)
fetch t_name into teacher_name-------将老师名字值赋予变量teacher_name
if t_name%found-------------开始遍历有值时插入以下数据
then
select name,count(*) into new_table
from table_teacher_student
where name=teacher_name group by name-----将一个老师名字依据条件插入新表数据
else
dmbs_output.put_line(‘完成所有工作’);---------遍历结束时输出完成工作
exit;
end if;
end loop;

仓促写下以上内容,可能部分语法报错,思路就是这样,很基本的一个游标使用。

逐一修改写个存储过程吧。
话说你能查出来就写个update就批量修改了,不用逐一修改吧。

cursor all_station is 
  select station_name from gj_station;
begin 
    open all_station ;
    loop 
        fetch all_station into start_station; 
        exit when all_station%notfound; 
    
        for end_station in (select station_name from gj_station) loop   
            insert into GJ_ZEROTRANS (id,start_station,line,end_station,stop_count)   
                (select zero_id.nextval,a1.station_name, a1.line_name, a2.station_name, (a2.position-a1.position) stopcount    
                from  *********    
                where a1.id = a2.id    and a1.position < a2.position); 
            commit; 
        end loop;
    end loop;




你的存储过程, 格式化一下以后


显示的是, 你是  30W * 30W 的级别来处理的啊



外面一个 

loop 

        fetch all_station into start_station; 

        exit when all_station%notfound; 


30W



里面一个

for end_station in (select station_name from gj_station) loop   


30W



也就是你执行了那个  30W * 30W  次  insert into GJ_ZEROTRANS  ... 语句啊...



1.为什么要用两个循环?第二个for循环的意义何在?
2.你定义了游标,为什么我在你循环往另外一个表插入数据的时候跟游标没半毛钱关系?
3.插入一笔数据就commit一次,commit也要花时间的大哥。

在做数据的insert之前,请将目标表的约束和索引去掉,inset完了之后,再建立
insert into tab1 select * from tab2;
commit;
直接用这个,一般千万级的数据可在一小时内完成。

建议直接用游标控制,只要一个循环。insert 时用批量提交。本来想帮你重新写一下,可是你的from **********,不知道你这里还有什么业务逻辑

分析下表数据,建立表的主键,利用主键索引查询,30w的数据不大,很快就可以查询出

oracle存储过程做双层循环
答:in b_cursor(a_cur.id) loop --这里是你要执行的操作,比如insert到c insert into c values (b_cur.id); commit; end loop; end loop;语法是这样的,具体字段自己改一下,看你要做什么样的操作了但如果是这种插入到一张表逻辑过于简单,可以直接用等值连接。

在oracle中创建一个存储过程,来循环获取 a表中存放的查询sql语句 并一...
答:PRM_返回值 OUT NUMBER,PRM_错误信息 OUT VARCHAR2) IS TYPE CURSOR_TYPE IS REF CURSOR;CUR_SQL CURSOR_TYPE;TYPE TYP_REC_INFO IS RECORD(COLUMN VARCHAR2(1000));LREC_INFO TYP_REC_INFO;BEGIN PRM_返回值 := 0;-- 循环获取查询SQL FOR REC_SQL IN (SELECT 查询SQL FROM 存放SQL的...

Oracle中游标与循环的问题
答:补充:更正:如果表中存在数据的话,第二个的最后一条记录重复出现一次。但是如果表中没有数据的话,第一个不会打印任何结果,第二个会打印一个【'学号:'',姓名:''】补充2:出现重复记录的原因(以两条数据为例):第一种情况:1、循环外先fetch一条,发现不是mycur%notfound,进入循环体打印第...

请教大虾们,反复执行同一个游标(cursor),每次从表中取出1000条,直到将...
答:据我理解,游标并不太占资源。就fetch一条 如果你做处理的时候,怕影响其他用户读数据,你可以分批处理,比如说处理这个月的数据。如果不影响其他用户,反正是所有的处理都一次完成,只是你的方法比较复杂。

遍历循环中使用什么关键字表里表示遍历结构
答:遍历循环中使用元素表里表示遍历结构。每次循环的时候,从遍历结构中提取其中的一个元素,放到前面的循环变量里,去执行下面的语句块,执行之后,再从遍历结构中提取下一个元素,当遍历结构中的所有元素都放入循环变量,并且都已经循环执行之后,程序退出。从遍历结构中逐一提取元素,放在循环变量中,由保留字...

oracle for循环求1到100之间的素数
答:declare /*思路:素数是只能被1和它本身整除的数,针对一个数n,从2到n-1对其求模,如果能整除就不是素数*/ v_result number; /*是否为素数,1为素数,0为非素数*/ j number; /*从2到i-1取模,如果能被整除就不是素数*/ begin for i in 1 .. 100 loop j := 2;v_result :...

求一个oracle程序块,循环插入A表一百行数据.
答:begin for i in 1..100 loop insert into a values(i,'名称'||i);end loop;end;说明上面执行出的结果如下:(1,名称1)(2,名称2)(3,名称3)。。。(100,名称100)如果不需要 名称后面带编号,可以把【'名称'||i】改成【'名称'】即可。--- 以上,希望对你有所帮助。

oracle同时调用同一个带参数的存储过程10次
答:---写个存储过程循环调用 create or replace PROCEDURE P_LOOP_EXEC IS EX_DUP_VALUE EXCEPTION;PRAGMA EXCEPTION_INIT(EX_DUP_VALUE,-1);V_DATE DATE;V_MONTH VARCHAR2(10);BEGIN V_DATE := TO_DATE('20120101','YYYYMMDD');WHILE V_DATE < SYSDATE LOOP V_MONTH := TO_CHAR(V_DATE...

。使用JAVA编写一个程序求出一个整数的所有因子的和
答:以下是一个使用Java编写的程序,用于求出一个整数的所有因子的和:在这个程序中,首先从用户那里获取一个整数输入。然后,使用一个循环来遍历从1到该整数的所有整数。对于每个整数,如果它是该整数的因子(即该整数除以该整数的余数为0),则将该整数加到总和中。最后,输出所有因子的和。例如,如果用户...

oracle 存储过程两个for循环 怎么写
答:for row_data in tb_student loop update student st set st.class_name = row_data.class_name where st.class_id = row_data.class_id end loop;但这样种循环更新效率确实很低,SQL是面向集合的运算,像你这种需求可以用一条更新SQL外加子查询来解决,不建议用循环来做。