Oracle数据库使用游标查询结果集所有数据

 
                                --案例一
DECLARE BEGIN
        FOR ROW IN ( SELECT * FROM pm_work_registration WHERE work_registration_code = 'GFDJ202103310115' )
        loop
        -- dbms_output.put_line(row.id || '----' || row.work_registration_code);
        INSERT INTO pm_registration_member ( id, main_id, work_registration_code, peoplecode, ismainhand, isapprentice, issectionchief, createdate, ext1 ) 
        SELECT
        sys_guid ( ) id,
        t.id main_id,
        t.work_registration_code,
        t.registration_user_code peoplecode,
   -- t.registration_user,
        t2.ismainhand,
        t2.isapprentice,
        t2.issectionchief,
        SYSDATE createdate,
        '初始化数据' ext1 
    FROM
        (
        SELECT
            id,
            work_registration_code,
            regexp_substr( registration_user_code, '[^,]+', 1, ROWNUM ) registration_user_code,
            regexp_substr( registration_user, '[^,]+', 1, ROWNUM ) registration_user 
        FROM
            ( SELECT * FROM pm_work_registration WHERE work_registration_code = ROW.work_registration_code ) registration_user_code CONNECT BY ROWNUM <= to_number( length( regexp_replace( registration_user_code, '[^,]+' ) ) + 1 ) 
        ) t
        INNER JOIN sys_people t2 ON t.registration_user_code = t2.peoplecode 
    WHERE
        t.work_registration_code NOT IN ( SELECT work_registration_code FROM pm_registration_member );
    
END loop;
END;
 

                                  --案例
DECLARE BEGIN
FOR ROW IN ( SELECT * FROM QUA_CHECKLIST )
loop
dbms_output.put_line(row.ID || '----' || row.NAME );
        FOR itemRow IN (SELECT rownum,t.* FROM (
        SELECT qi.ITEMNAME,qc.* FROM ALMES.QUA_CHECKLISTITEM qc 
LEFT JOIN ALMES.QUA_ITEM qi ON qc.ITEMID = qi.ID
WHERE qc.CHECKLISTID = ROW.ID
        --'5dd23207-f8d9-4e59-ab1a-e89962bdd7b9'
ORDER BY qi.ITEMNAME ASC
        )t)
        LOOP
        --SELECT t.SORTNO FROM QUA_CHECKLISTITEM t WHERE t.CHECKLISTID = '5dd23207-f8d9-4e59-ab1a-e89962bdd7b9';
        UPDATE QUA_CHECKLISTITEM t SET t.SORTNO = itemRow.rownum WHERE t.ID = itemRow.ID;
        --dbms_output.put_line(itemRow.ID || '-----' || itemRow.rownum || '----' || itemRow.ITEMNAME );
        END LOOP;

END loop;
END;

                                --方法三 使用游标遍历表
DECLARE 
   --表名
      myTabelName NVARCHAR2(200):='';
      --行内容
      myTableRowComment NVARCHAR2(200):='';
      --结果
      result VARCHAR2(2000):='';
      --定义游标 
      CURSOR myCursor IS SELECT * FROM 结果集(表名/视图名/查询结果) ORDER BY (结果集中的列名); 
      --定义游标记录类型
      myRecord myCursor%ROWTYPE;   
BEGIN   
    --打开游标
    OPEN myCursor;
    --判断打开成功
    IF myCursor %ISOPEN  THEN
       ---------------------游标打开成功 
       BEGIN   
       LOOP 
       --循环获取记录集
       BEGIN 
           
            FETCH myCursor into myRecord;
            --游标的FOUND属性判断是否有记录
            IF myCursor%FOUND THEN
               BEGIN  
                    myTabelName:='TEC_PARTTEC';
                    myTableRowComment:=myRecord.ID||'    '||myRecord.CREATEDATE||'    '
                       ||myRecord.CREATEUSER||'    '||myRecord.ORGANIZATIONID||'    '
                        ||myRecord.PARTID||'    '||myRecord.PROCESSTYPE||'    '
                         ||myRecord.VERSION||'    '||myRecord.REMARK||'    '
                       ||myRecord.STATE;    
                    
                    result:='表名    '||myTabelName||'    列值    '||myTableRowComment;
                    
                    result:=myTabelName||'    '||myTableRowComment;
                    
                    DBMS_OUTPUT.PUT_LINE(result);     
    
               END;
            ELSE
               --游标中的记录为空 退出
               EXIT;
            --结束IF语句
            END IF;
       --循环获取记录结束 
       END LOOP; 
       END  
    ELSE     
        DBMS_OUTPUT.PUT_LINE('游标没有打开');   
    END IF; 
CLOSE myCursor;
 
 
END;
 
posted @ 2019-05-16 16:50  Journey&Flower  阅读(6423)  评论(0编辑  收藏  举报