Come restituire più righe da oracle stored procedure da più cursori?

Ho bisogno di stored procedure in cui posso correre più cursori.

Loop su ogni cursore e poi fare qualche operazione su ogni riga.

In questo modo avrò il risultato desiderato da questi cursori. Risultato di tale più cursori quindi deve essere l’unione con alcune altre righe e poi filtrate e restituire le righe, infine, dal proc.

Si prega di notare che ogni cusror e un’altra query avranno le stesse colonne.

Non sono sicuro di come fare questo in oracle.

Si prega di aiutare anche me.

        create or replace PROCEDURE test_proc
    (
      -- some inputs 
      hc_cursor OUT SYS_REFCURSOR
    ) 

    IS 

    cursor cursor_one is 
        SELECT * FROM table_one ; 

    BEGIN    

     FOR current_row in cursor_one
      loop 

          -- do some modification on each row and return each modified row

      end loop; 

    cursor cursor_two is 
        SELECT * FROM table_one ; 

    BEGIN    

     FOR current_row in cursor_two
      loop 

          -- do some modification on each row and return each modified row
          -- append to result from first cursor 

      end loop; 


    -- union results from both these cusrors with some another query 
    -- now filter these records on some criterais 
    -- return finally

    END;    
  • Utilizzare il cursore per recuperare il risultato in tabella Nidificata e quindi aggiornare la tabella nidificata con manipolato risultato .Dopo la modifica ,apre un cursore che la tabella nidificata …select * from table(nested_table)…con questo modo si può tornare più risultato cursore

 

3 Replies
  1. 3

    Mio suggerimento sarà inserire le righe dal cursore in una tabella temporanea. Quindi unire la tabella temporanea con la tua tabella esistente per i criteri di filtro parlare. Psuedocode:

    create or replace function my_func
    return sysrefcursor
    is
        cursor cursor_one is 
            SELECT * FROM table_one ; 
    
        cursor cursor_two is 
            SELECT * FROM table_one ; 
        BEGIN    
    
         FOR current_row in cursor_one
          loop 
    
              -- do some modification on each row and insert into temporary table
    
          end loop; 
    
    
    
         FOR current_row in cursor_two
          loop 
    
              -- do some modification on each row and insert into temporary table
    
          end loop; 
    
    
        -- results from cursor 1 and 2 exist in temporary table
    
        open out_cursor for
         select t.* from
          my_temp_table t
          join
          my_other_table tt
          on (t.col1 = tt.col1) -- or whatever columns are appropriate
          where t.col2 = 'some criteria' -- or whatever filter criteria you like.
    
        return out_cursor;
    
        END;  
    • :Che è migliore opzione che i miei 🙂 +1 per questo ,io sto facendo il codice complesso
  2. 0
    create  type emp_obj AS object 
    (
     empno    NUMBER (4)        
    ,ename  VARCHAR2(10)
    ,sal      number(7,2)
    ,job      varchar2(9)
    );
    
    CREATE TYPE EMP_NT AS TABLE OF emp_OBJ;
    
    
    create or replace package test_pkg
    IS
    TYPE abc_cur is REF CURSOR;
    
    procedure test_proc
    (
    p_rec IN OUT abc_cur
    );
    
    END test_pkg;
    /
    
    create or replace package body test_pkg
    IS 
    procedure test_proc
    (
    p_rec IN OUT abc_cur
    )
    IS
    v_emp_nt emp_nt;
    BEGIN
    
    SELECT emp_obj(empno,ename,sal,job) BULK COLLECT INTO v_emp_nt FROM EMP;
    
    FOR i in v_emp_nt.first..v_emp_nt.last 
    LOOP
    
    IF v_emp_nt(i).job='CLERK' THEN 
    
        v_emp_nt(i).sal := v_emp_nt(i).sal +200;
    
    ELSIF v_emp_nt(i).job='MANAGER' THEN
    
        v_emp_nt(i).sal := v_emp_nt(i).sal +800;
    END IF;
    
    END LOOP;
    
    open p_rec for select * from table(v_emp_nt); 
    
    END test_proc;
    
    END test_pkg;
    /

    Come avete visto il codice,quello che faccio ,è quello di ottenere il risultato desiderato in nested table(che cosa il vostro cursore sta facendo) ,e fare qualche manipolazione basata sulla risultante record ,nonché di aggiornare la tabella nidificata.

    Alla fine voglio creare un cursore da questo updated nested table e riportare il cursore dopo l’apertura.
    Come restituire più righe da oracle stored procedure da più cursori?

    Ora la tua domanda :How can you return append cursor ?

    È semplice create two nested table ,do some manipulation on both the nested table

    Si supponga di avere v_emp_nt1 come first nested table ,fai un po ‘ di manipolazione che .
    si dispone di un altro v_emp_nt2 come second nested table ,fai un po ‘ di manipolazione che .

    Ora il tuo cursor sarà come

     open p_rec FOR (select * from v_emp_nt1 union select * from v_empnt2);

    Con questo modo è possibile ottenere il risultato desiderato .

    ** * * * Nota:**Il codice di cui sopra è per una tabella nidificata ,è necessario creare un’altra tabella nidificata per il codice, per completare

  3. 0
    create
    package my_pkg as
    
       type my_rec is record
       (
         <list your fields here>
       );
    
       type my_rec_tab is table of my_rec;
    
       function get_my_rows
         return my_rec_tab pipelined;
    
    end my_pkg;
    
    create
    package body my_pkg as
    
       function get_my_rows
         return my_rec_tab pipelined
       as
       begin
    
          for c_cur in (select * from table_one)
          loop
    
             -- do some modification on the current row and return the modified row
    
             pipe row (c_cur);
    
          end loop;
    
          for c_cur in (select * from table_one)
          loop
    
             -- do some modification on the current row and return the modified row
    
             pipe row (c_cur);
    
          end loop;
    
          return;
    
       end get_my_rows;
    
    end my_pkg;
    
    select * from table(my_pkg.get_my_rows);

Lascia un commento