2015-03-27 7 views
0

Я пытаюсь вставить в таблицу. Я новичок в этом и пытаюсь учиться. Я использую SQLDEV. Я считаю, что это должно быть какое-то время вложенного цикла, но я просто не могу понять это. Таблица предназначена для сотрудников и их иждивенцев. Я просто пытаюсь установить SEQ_NO. Например, каждый человек с BREL_CODE в 'E' SEQ_NO должен быть установлен в 1. После этого числа должны увеличиваться на 1, пока не достигнет нового PIDM, тогда цикл должен начинаться снова и повторять процесс. Например .... первые 9 строк в столбцах SEQ_NO должны быть 1,2,3,4,2,1,2,1,1 ...Вставить в таблицу SQLDev

Sample Data: 
(PZRBENE_PIDM,PZRBENE_SEQ_NO,PZRBENE_BENE_PIDM,PZRBENE_BENE_LAST_NAME,PZRBENE_BENE_FIRST_NAME,PZRBENE_BENE_MI,PZRBENE_BREL_CODE,PZRBENE_SEX_IND,PZRBENE_BIRTH_DATE,PZRBENE_SSN,PZRBENE_MEMBER_TYPE,PZRBENE_DEL_IND) values (33159,null,null,'Regr','Ken',null,'E','F',to_date('09-FEB-68','DD-MON-RR'),'111111111','N','N'); 
Insert into PZRBENE (PZRBENE_PIDM,PZRBENE_SEQ_NO,PZRBENE_BENE_PIDM,PZRBENE_BENE_LAST_NAME,PZRBENE_BENE_FIRST_NAME,PZRBENE_BENE_MI,PZRBENE_BREL_CODE,PZRBENE_SEX_IND,PZRBENE_BIRTH_DATE,PZRBENE_SSN,PZRBENE_MEMBER_TYPE,PZRBENE_DEL_IND) values (33159,null,null,'Reg','Den',null,'H','M',to_date('24-DEC-71','DD-MON-RR'),'222222222','D','N'); 
Insert into PZRBENE (PZRBENE_PIDM,PZRBENE_SEQ_NO,PZRBENE_BENE_PIDM,PZRBENE_BENE_LAST_NAME,PZRBENE_BENE_FIRST_NAME,PZRBENE_BENE_MI,PZRBENE_BREL_CODE,PZRBENE_SEX_IND,PZRBENE_BIRTH_DATE,PZRBENE_SSN,PZRBENE_MEMBER_TYPE,PZRBENE_DEL_IND) values (33159,null,null,'Regr','Lev',null,'C','M',to_date('12-NOV-10','DD-MON-RR'),'333333333','D','N'); 
Insert into PZRBENE (PZRBENE_PIDM,PZRBENE_SEQ_NO,PZRBENE_BENE_PIDM,PZRBENE_BENE_LAST_NAME,PZRBENE_BENE_FIRST_NAME,PZRBENE_BENE_MI,PZRBENE_BREL_CODE,PZRBENE_SEX_IND,PZRBENE_BIRTH_DATE,PZRBENE_SSN,PZRBENE_MEMBER_TYPE,PZRBENE_DEL_IND) values (33159,null,null,'Reger','Ja',null,'C','M',to_date('12-AUG-05','DD-MON-RR'),'444444444','D','N'); 
Insert into PZRBENE (PZRBENE_PIDM,PZRBENE_SEQ_NO,PZRBENE_BENE_PIDM,PZRBENE_BENE_LAST_NAME,PZRBENE_BENE_FIRST_NAME,PZRBENE_BENE_MI,PZRBENE_BREL_CODE,PZRBENE_SEX_IND,PZRBENE_BIRTH_DATE,PZRBENE_SSN,PZRBENE_MEMBER_TYPE,PZRBENE_DEL_IND) values (33161,null,null,'Lace','Hary','C','H','M',to_date('15-SEP-47','DD-MON-RR'),'555555555','D','N'); 
Insert into PZRBENE (PZRBENE_PIDM,PZRBENE_SEQ_NO,PZRBENE_BENE_PIDM,PZRBENE_BENE_LAST_NAME,PZRBENE_BENE_FIRST_NAME,PZRBENE_BENE_MI,PZRBENE_BREL_CODE,PZRBENE_SEX_IND,PZRBENE_BIRTH_DATE,PZRBENE_SSN,PZRBENE_MEMBER_TYPE,PZRBENE_DEL_IND) values (33161,null,null,'Love','Rose','M','E','F',to_date('10-FEB-51','DD-MON-RR'),'666666666','N','N'); 
Insert into PZRBENE (PZRBENE_PIDM,PZRBENE_SEQ_NO,PZRBENE_BENE_PIDM,PZRBENE_BENE_LAST_NAME,PZRBENE_BENE_FIRST_NAME,PZRBENE_BENE_MI,PZRBENE_BREL_CODE,PZRBENE_SEX_IND,PZRBENE_BIRTH_DATE,PZRBENE_SSN,PZRBENE_MEMBER_TYPE,PZRBENE_DEL_IND) values (33163,null,null,'Wilon','La','E','C','F',to_date('12-FEB-02','DD-MON-RR'),'777777777','D','N'); 
Insert into PZRBENE (PZRBENE_PIDM,PZRBENE_SEQ_NO,PZRBENE_BENE_PIDM,PZRBENE_BENE_LAST_NAME,PZRBENE_BENE_FIRST_NAME,PZRBENE_BENE_MI,PZRBENE_BREL_CODE,PZRBENE_SEX_IND,PZRBENE_BIRTH_DATE,PZRBENE_SSN,PZRBENE_MEMBER_TYPE,PZRBENE_DEL_IND) values (33163,null,null,'Wilson','Janet',null,'E','F',to_date('01-JAN-64','DD-MON-RR'),'888888888','N','N'); 
Insert into PZRBENE (PZRBENE_PIDM,PZRBENE_SEQ_NO,PZRBENE_BENE_PIDM,PZRBENE_BENE_LAST_NAME,PZRBENE_BENE_FIRST_NAME,PZRBENE_BENE_MI,PZRBENE_BREL_CODE,PZRBENE_SEX_IND,PZRBENE_BIRTH_DATE,PZRBENE_SSN,PZRBENE_MEMBER_TYPE,PZRBENE_DEL_IND) values (33164,null,null,'Choski','Jon',null,'E','M',to_date('14-MAR-52','DD-MON-RR'),'123456789','N','N'); 
Insert into PZRBENE (PZRBENE_PIDM,PZRBENE_SEQ_NO,PZRBENE_BENE_PIDM,PZRBENE_BENE_LAST_NAME,PZRBENE_BENE_FIRST_NAME,PZRBENE_BENE_MI,PZRBENE_BREL_CODE,PZRBENE_SEX_IND,PZRBENE_BIRTH_DATE,PZRBENE_SSN,PZRBENE_MEMBER_TYPE,PZRBENE_DEL_IND) values (33169,null,null,'Parck','Wilim','G','C','M',to_date('09-MAY-03','DD-MON-RR'),'99999999','D','N'); 


My Code: 
update pzrbene 
set pzrbene_seq_no = 1 
where pzrbene_brel_code = 'E'; 
*/ 

set serveroutput on: 
Declare 
cursor p_cur is 

select pzrbene_seq_no,pzrbene_pidm 
from pzrbene 
where pzrbene_brel_code <> 'E' 
order by pzrbene_pidm; 

p_pidm  PZRBENE.PZRBENE_PIDM%TYPE; 
p_seq_no  number := 0; 
p_brel_code pzrbene.pzrbene_brel_code%TYPE; 

Begin 

    open p_cur; 
    fetch p_cur into p_seq_no,p_pidm ; 
    while p_cur%FOUND 
    LOOP 
    update pzrbene 
     SET PZRBENE_SEQ_NO = p_seq_no + 1 where p_pidm = pzrbene.pzrbene_pidm and p_brel_code= pzrbene_brel_code; 
    fetch p_cur into p_seq_no,p_pidm; 
    end loop; 

    end; 
/
+0

Где мой код? – Bonifacio2

+0

Что это за ваши данные, которые его заказывают? В приведенных примерах нет ничего, что указано для заданного 'PIDM', какая строка первая, следующая и т. Д. Также есть первичный ключ или какая-то другая уникальность, которая может идентифицировать каждую отдельную строку? – Boneist

+1

Я не вижу начального старта INSERT, почему вы ожидаете его вставить? – HLGEM

ответ

0

Этот PLSQL блок работал для меня. Здесь ничего особенного, просто вопрос правильного заказа. Я предположил, что кто-то с MEMBER_TYPE = 'N' является боссом.

declare 
    v_counter number := 0; 
    cursor cur is select pzrbene_pidm pidm, pzrbene_brel_code brel_code 
    from pzrbene order by pzrbene_pidm, pzrbene_member_type desc 
    for update; 
begin 
    for rec in cur loop 
    if rec.brel_code = 'E' then 
     v_counter := 1; 
    else 
     v_counter := v_counter + 1; 
    end if; 
    update pzrbene set pzrbene_seq_no = v_counter where current of cur; 
    end loop; 
end; 

Выход после выполнения:

select pzrbene_pidm pidm, pzrbene_seq_no, 
    pzrbene_bene_last_name||' '||pzrbene_bene_first_name bene_name, 
    pzrbene_brel_code brel_code, pzrbene_member_type member_type 
    from pzrbene 
    order by pzrbene_pidm, pzrbene_member_type desc 

    PIDM PZRBENE_SEQ_NO BENE_NAME       BREL_CODE MEMBER_TYPE 
------ -------------- ------------------------------------ --------- ----------- 
33159    1 Regr Ken        E   N   
33159    2 Reg Den        H   D   
33159    3 Regr Lev        C   D   
33159    4 Reger Ja        C   D   
33161    1 Love Rose       E   N   
33161    2 Lace Hary       H   D   
33163    1 Wilson Janet       E   N   
33163    2 Wilon La        C   D   
33164    1 Choski Jon       E   N   
33169    2 Parck Wilim       C   D 

Вы можете изменить заказ на что-то более сложное, например:

order by pzrbene_pidm, 
    case when pzrbene_member_type='N' then 1 else 2 end, pzrbene_bene_brel_code 

это до вас, я не знаю, смысл этих столбцов, которые более важны, что меньше, когда остальные равны между двумя строками.

Смежные вопросы