Oracle 9i : Sequenz temporär speichern?

cemiboy

Mitglied
sers mein Anliegen ist folgendes :
Beispielcode:
PHP:
insert into tabelle (sq,name,....)
select seq_tabelle.nextval seq,prodname,....)
from tabell_prod
where....
and....

v_temp := seq;

nun möchte ich wie ihr sehen könnt die seq in v_temp zwischenspeichern aber irgendwie macht er das net. Habt ihr ne Ahnung wieso? Oder ein Vorschlag wie ich das machen kann?

Bitte um Hilfe!! :confused:

mfg
 
:) das das so geht weiss ich auch . Nur ist das für unter einem Insert ist dort so was überhaupt möglich ?

PHP:
insert into t_www_wk
        (sid, sq_no, prod_name, opt_flag, datum, referer)
        select pi_sid,
               s_www_wk.nextval sq, <-------- den brauch ich im v_temp
               prod_name,
               null,
               sysdate,
         from t_product d
         where d.prod_name = f_rec.opt_name
           and d.ctry_code = 'XD'

Vielleicht sollte ich noch erwähnen das ich genau diese Seqnummer brauche damit ich sie nacher beim Unterprodukt im 2 insert als referer setzen kann!
 
:) das das so geht weiss ich auch . Nur ist das für unter einem Insert ist dort so was überhaupt möglich ?

PHP:
insert into t_www_wk
        (sid, sq_no, prod_name, opt_flag, datum, referer)
        select pi_sid,
               s_www_wk.nextval sq, <-------- den brauch ich im v_temp
               prod_name,
               null,
               sysdate,
         from t_product d
         where d.prod_name = f_rec.opt_name
           and d.ctry_code = 'XD'

Vielleicht sollte ich noch erwähnen das ich genau diese Seqnummer brauche damit ich sie nacher beim Unterprodukt im 2 insert als referer setzen kann!


- Ja, dann beziehe doch den Sequencewert vor dem Insert (mit select into....) und speicher dann den inhalt der v_temp
 
Das alles hängt unter einer for schleife....ich versuche mal zu erklären :)

Nein das wäre zu kompliziert ich zeig mal den code :) aber net erschrecken ...


PHP:
procedure add_wk(pi_prod_name varchar2,
                   pi_ctry      varchar2,
                   pi_sid       varchar2,
                   pi_user      varchar2,
                   pi_qty       number) is
  
    --Deklarationsteil   
    l_ref_temp     number; --tempvar
    l_wkref        number; --referer
    l_check_wk     varchar2(10); --prüfvar
    l_check_pos    varchar2(10);
    l_wknumber     number;
    v_lastlevel    number;
    v_lastsequence number;
    v_seq          number;
    v_temp         number;
    v_level        number;
    v_arraytemp    number;
    sq             number;
  
    type a_array is table of number index by binary_integer;
    v_array a_array;
  
    Cursor c_wk_struct is
      select 0 ll, pi_prod_name opt_name
        from dual
      union all
      select ll, opt_name
        from (select level ll, opt_name
                from t_pdz_must_opt_z m
               where m.opt_class in ('FIX', 'DEF')
              connect by m.prod_name = prior m.opt_name
                     and m.opt_class in ('FIX', 'DEF')
               start with m.prod_name = pi_prod_name) opts,
             t_pdz_product_z p
       where opts.opt_name = p.prod_name
         and p.conf_flag = 'O';
  
  begin
  
    --Check if n_array have no elements.
    -----array vor start leeren !
  
    for f_rec in c_wk_struct loop
      v_level := f_rec.ll;
      dbms_output.put_line('levelbereich:' || v_level);
    
      if v_level > v_lastlevel then
        v_array(v_level) := v_lastsequence;
        v_temp := v_array(v_level);
      
      end if;
    
      dbms_output.put_line('v_array:' || v_temp);
    
      insert into t_www_wk_pos
        (sid, sq_no, prod_name, opt_flag, datum, referer)
        select pi_sid, s_www_wk.nextval, d.prod_name, null, sysdate, v_temp
          from t_pdz_product_diff d
         where d.prod_name = f_rec.opt_name
           and d.ctry_code = 'XD'
           and f_rec.opt_name = pi_prod_name;
    
      insert into t_www_wk_pos
        (sid, sq_no, prod_name, opt_flag, datum, referer)
        select pi_sid,
               s_www_wk.nextval,
               m.opt_name,
               m.opt_class,
               sysdate,
               v_temp
          from t_must_opt m, t_pdz_product_z z, t_pdz_product_diff d
         where m.prod_name = f_rec.opt_name
           and m.prod_name = z.prod_name
           and m.opt_name = d.prod_name
           and d.ctry_code = 'XD'
           and z.conf_flag != 'o'
           and m.opt_class in ('FIX', 'DEF');
    
      dbms_output.put_line('testsq:' || v_seq);
    
      v_lastlevel    := v_level;
      v_lastsequence := v_seq;
      dbms_output.put_line(v_level || ' ' || f_rec.opt_name || ' ');
    
    end loop;
  
    commit;
  end;

viel spass beim verstehen :eek:
 
Code:
procedure add_wk(pi_prod_name varchar2,
                   pi_ctry      varchar2,
                   pi_sid       varchar2,
                   pi_user      varchar2,
                   pi_qty       number) is
  
    --Deklarationsteil   
    l_ref_temp     number; --tempvar
    l_wkref        number; --referer
    l_check_wk     varchar2(10); --prüfvar
    l_check_pos    varchar2(10);
    l_wknumber     number;
    v_lastlevel    number;
    v_lastsequence number;
    v_seq          number;
    v_temp         number;
    v_level        number;
    v_arraytemp    number;
    sq             number;
mySeq number;
  
    type a_array is table of number index by binary_integer;
    v_array a_array;
  
    Cursor c_wk_struct is
      select 0 ll, pi_prod_name opt_name
        from dual
      union all
      select ll, opt_name
        from (select level ll, opt_name
                from t_pdz_must_opt_z m
               where m.opt_class in ('FIX', 'DEF')
              connect by m.prod_name = prior m.opt_name
                     and m.opt_class in ('FIX', 'DEF')
               start with m.prod_name = pi_prod_name) opts,
             t_pdz_product_z p
       where opts.opt_name = p.prod_name
         and p.conf_flag = 'O';
  
  begin
  
    --Check if n_array have no elements.
    -----array vor start leeren !
  
    for f_rec in c_wk_struct loop
      v_level := f_rec.ll;
      dbms_output.put_line('levelbereich:' || v_level);
    
      if v_level > v_lastlevel then
        v_array(v_level) := v_lastsequence;
        v_temp := v_array(v_level);
      
      end if;
    
      dbms_output.put_line('v_array:' || v_temp);

SELECT s_www_wk.NEXTVAL into mySeq from dual;

      insert into t_www_wk_pos
        (sid, sq_no, prod_name, opt_flag, datum, referer)
        select pi_sid, mySeq, d.prod_name, null, sysdate, v_temp
          from t_pdz_product_diff d
         where d.prod_name = f_rec.opt_name
           and d.ctry_code = 'XD'
           and f_rec.opt_name = pi_prod_name;
    
      insert into t_www_wk_pos
        (sid, sq_no, prod_name, opt_flag, datum, referer)
        select pi_sid,
               mySeq,
               m.opt_name,
               m.opt_class,
               sysdate,
               v_temp
          from t_must_opt m, t_pdz_product_z z, t_pdz_product_diff d
         where m.prod_name = f_rec.opt_name
           and m.prod_name = z.prod_name
           and m.opt_name = d.prod_name
           and d.ctry_code = 'XD'
           and z.conf_flag != 'o'
           and m.opt_class in ('FIX', 'DEF');
    
      dbms_output.put_line('testsq:' || v_seq);
    
      v_lastlevel    := v_level;
      v_lastsequence := v_seq;
      dbms_output.put_line(v_level || ' ' || f_rec.opt_name || ' ');
    
    end loop;
  
    commit;
  end;

- In deinem Beispiel würde im 2. Insert eine neue Sequenz gelöst und gespeichert, ich weiss nicht, ob das so gewollt war
- Ich habe mal einen neue Variable myseq definiert, um meine änderungen deutlicher zu machen
- und nein, erschrocken bin ich nicht :-)
 
Dein Beispiel hatte ich auch schon nur das problem ist das mein Insert mir mehrere rows liefert und dann es so aussieht das 3 rows die gleiche seq. haben .
Ich muss es so hinbekommen das jeder row eigene seq. hat und mir von jeder row die seq. merken :)

.....übel ne:eek:
 
Dein Beispiel hatte ich auch schon nur das problem ist das mein Insert mir mehrere rows liefert und dann es so aussieht das 3 rows die gleiche seq. haben .
Ich muss es so hinbekommen das jeder row eigene seq. hat und mir von jeder row die seq. merken :)

.....übel ne:eek:

- hmmm...hab mal ein kleines beispiel gemacht mit der Returning Clause beim insert :


Code:
CREATE TABLE testapp.testtable
    (id                             NUMBER,
    somewhat                       VARCHAR2(200))
/
CREATE SEQUENCE testapp.testseq
  INCREMENT BY 1
  START WITH 1
  MINVALUE 1
  MAXVALUE 999999999999999999999999999
  NOCYCLE
  NOORDER
  CACHE 20
/

FUNCTION TEST
  RETURN  number IS
l_nResult number;
BEGIN 
   INSERT INTO TESTTABLE
        VALUES (TESTSEQ.NEXTVAL  , 'bla')
     RETURNING ID 
          INTO l_nResult;
          
      return l_nResult;    
          
END;

- Die gibt jeweils die aktuell verwendete Sequenz zurück....wie es bei deinen Multirow - Insert's funktioniert, weiss ich auch nicht, aber vielleicht kannst du damit was anfangen
 
Zuletzt bearbeitet:
Zurück