2013-01-08 4 views

Répondre

2

devoirs?

c'est SQL de base. En général, vous rejoindriez les deux tables.

begin 
    for r_row in (select b.* 
        from tab1 a 
         inner join tab2 b 
           on b.id = a.id) 
    loop 
    null; -- do whatever 
    end loop; 
end; 
/

si vous avez un curseur existant et ne peut pas changer

par exemple où your_cursor est juste une colonne ID retournaient.

begin 
    open your_cursor; 
    loop 
    fetch your_cursor into v_id; 
    exit when your_cursor%notfound; 
    for r_row in (select * from tab2 b where b.id = v_id) 
    loop 
     null; -- do whatever here. 
    end loop; 
    end loop; 
end; 
/

modifier: selon commentaires:

certaines données de l'échantillon:

SQL> create table table1 (id number primary key, name varchar2(20)); 

Table created. 

SQL> create table table2 (id number, col1 varchar2(20), col2 varchar2(20)); 

Table created. 

SQL> insert into table1 values (1, 'test'); 

1 row created. 

SQL> insert into table1 values (2, 'foo'); 

1 row created. 

SQL> 
SQL> insert into table2 values (1, 'John', 'Smith'); 

1 row created. 

SQL> insert into table2 values (1, 'Peter', 'Jones'); 

1 row created. 

SQL> insert into table2 values (1, 'Jane', 'Doe'); 

1 row created. 

SQL> insert into table2 values (2, 'Nina', 'Austin'); 

1 row created. 

SQL> insert into table2 values (2, 'Naman', 'Goyal'); 

1 row created. 

SQL> commit; 

Commit complete. 

créer un type pour maintenir la structure de retour. noter que les types de données doivent correspondre aux types de données des tables table1 et table2 (% de type ne fonctionnera pas, alors assurez-vous qu'ils correspondent)

SQL> create type my_obj as object (
    2 id number, 
    3 name varchar2(20), 
    4 col1 varchar2(20), 
    5 col2 varchar2(20) 
    6 ); 
    7/

Type created. 

SQL> create type my_tab as table of my_obj; 
    2/

Type created. 

maintenant créer votre fonction (vous pouvez mettre ceci dans un paquet si, votre vrai code, vous l'avez comme ça).

SQL> create function function1 
    2 return my_tab pipelined 
    3 is 
    4 begin 
    5 for r_row in (select t1.id, t1.name, t2.col1, t2.col2 
    6     from table1 t1 
    7       inner join table2 t2 
    8         on t1.id = t2.id) 
    9 loop 
10  pipe row(my_obj(r_row.id, r_row.name, r_row.col1, r_row.col2)); 
11 end loop; 
12 end; 
13/

Function created. 

SQL> 
SQL> select * 
    2 from table(function1); 

     ID NAME     COL1     COL2 
---------- -------------------- -------------------- -------------------- 
     1 test     John     Smith 
     1 test     Peter    Jones 
     1 test     Jane     Doe 
     2 foo     Nina     Austin 
     2 foo     Naman    Goyal 

vous pouvez passer des entrées si nécessaire dans cette fonction par exemple table(function1('a', 'b')); etc ..

+0

Merci pour votre réponse. Dans le code ci-dessous - –

+0

Merci pour votre réponse. Le code provided- pour r_row en (select * from tab2 b où b.id = v_id) boucle null; - Faites n'importe quoi ici. boucle d'extrémité; Dans ce code, je vais obtenir des valeurs de tab2, mais je veux garder ces valeurs de tab2 pour quelques ID et retourner toutes ces valeurs de procédure stockée. Comment puis-je faire cela .. –

+0

@NamanGoyal comment allez-vous les utiliser? nous pouvons les renvoyer comme un tableau assez facilement. cela aiderait-il?ou voulez-vous que la sortie corresponde à un ensemble de résultats (par exemple, voulez-vous sélectionner select id de your_func() 'ou' return_array = your_func() ') – DazzaL

Questions connexes