2014-08-30 4 views
0

Quelqu'un peut-il me dire comment puis-je déboguer une fonction avec un type de table comme paramètre d'entrée et cette fonction retourne un type de table pipeline.Mise au point d'une fonction avec le type de table en tant que paramètre d'entrée

S'il vous plaît voir ci-dessous details.When je tente de tester la fonction crée ci-dessous bloc anonyme, mais quand je clique sur le bouton de débogage, il donne l'erreur:

bloc Anonymous:

declare 
    -- Non-scalar parameters require additional processing 
    result t_bmk_q; 
    pit_srch_str t_parm; 
begin 
    -- Call the function 
    result := f_bmk_srch(pit_srch_str => pit_srch_str, 
           piv_op => 'ALL'); 
end; 


---f_bmk_q function returns table type t_bmk_q pipelined 


defintions: 
============== 
t_bmk_q --->table type 

t_bmk_q is TABLE OF r_bmk_q -->object of some attributes. 


pit_srch_str ---> is parameter of type t_parm which is table type of r_parm 


--plz see def of r_parm: 

CREATE OR REPLACE TYPE r_parm AS OBJECT 
    (
     p_abc     varchar2(200) 
       ,p_new_val    varchar2(2000) 
       ,CONSTRUCTOR FUNCTION r_parm 
        (
        p_abc     varchar2 
        ,p_new_val    varchar2 
       ) RETURN SELF AS RESULT 
     ); 

Example:I have below sample values to test and debug: 
r_parm('TAB1.VALUE','123321123') 

Merci Rajesh

+0

Et ... quelle erreur avez-vous eu? Et avez-vous remarqué la partie "nécessite un traitement supplémentaire"? –

+0

Oui, j'ai remarqué, mais je ne suis pas sûr de ce que les choses supplémentaires que j'ai besoin d'ajouter pour le paramètre d'entrée d'objet de type table multi dimensionnelle. – user2090701

Répondre

2

Il semble que vous utilisiez une fenêtre de test développeur PL/SQL pour exécuter les tests. Je reconnais le commentaire Non-scalar parameters require additional processing.

La fenêtre de test du développeur PL/SQL ne gère pas correctement les fonctions pipelines. Il est préférable de supprimer la variable result et d'encapsuler l'appel de fonction au open :cursor for select * from table(...). Ajoutez une variable nommée cursor de type Curseur à la liste des variables sous la fenêtre.

Pour remplir la table d'entrée, vous pouvez simplement 'appeler' le type de table, en passant chaque ligne de la table en tant qu'argument séparé. Par exemple,

t_parm(r_parm(...), r_parm(...), r_parm(...)) 

Vous pouvez ajouter autant de lignes à la table que vous le souhaitez.

Mettre ces deux changements ensemble, nous avons quelque chose comme ce qui suit:

declare 
    pit_srch_str t_parm; 
begin 
    -- Create input table.  
    pit_srch_str := t_parm(
      r_parm('TAB1.VALUE','123321123'), 
      r_parm('TAB2.VALUE','456597646') 
); 

    -- Call the function 
    open :cursor for select * from table(f_bmk_srch(pit_srch_str => pit_srch_str, 
           piv_op => 'ALL')); 
end; 
/

Une fois que vous avez exécuté la fonction, vous pouvez obtenir les résultats à partir du bouton de variable cursor (utilisez le ... à l'extrême droite).

Questions connexes