2010-10-14 8 views
3

Je vais encore avec quelques PLSQL ..PLSQL retour valeurs

Je veux savoir, s'il y a quelque façon que je peux utiliser la fonction suivante comme une sélection sans avoir à en faire une fonction ou d'une procédure (donc je peut voir le code du script où il est contenu).

Le code serait comme:

DECLARE 
    outpt VARCHAR2(1000) := ''; 
    flow_rI VARCHAR2(50); 
    CURSOR flow_r IS 
     select flow_run_id 
     from table 
     where CREATED_DATE < sysdate - 32 
     and rownum < 10 
     order by 1 desc; 
BEGIN 
    OPEN flow_r; 
    LOOP 
     FETCH flow_r INTO flow_rI; 
     EXIT WHEN flow_r%notfound; 
     BEGIN 
      outpt := outpt || ',' || flow_rI; 
     EXCEPTION 
      WHEN no_data_found THEN 
       dbms_output.Put_line(outpt); 
     END; 
    END LOOP; 
    dbms_output.Put_line(outpt); 
    outpt := ''; 
    CLOSE flow_r; 
END; 

L'idée est simple, je veux juste obtenir une série de codes de mon table mais ayant les résultats mis en forme comme "1234,2434,424,45,767,43" genre de chose, plutôt que le résultat de la table à partir d'une requête. Il sera utilisé plus tard dans le code à diverses fins, y compris d'autres requêtes où je pourrais simplement faire un in ([variable with that string]).

Chose est qu'en utilisant le dbms_output.Put_line(outpt);, je ne peux pas y accéder à partir de ma couche d'application et semble que dans plsql je ne peux pas utiliser le return sans le transformer en une fonction.

Quelqu'un aurait-il une idée? Il n'a pas besoin d'être un PlSql comme ça tant que je peux avoir le code entier dans le script.

merci!

f.

+0

ps .: oui, je sais que j'ai un reste "," au début de la chaîne -_- – filippo

Répondre

9

Pourquoi ne pas utiliser simplement sql:

SELECT MAX(ltrim(sys_connect_by_path(flow_run_id, ','), ',')) 
    FROM 
    (
    select flow_run_id, rownum rn 
    from table 
    where CREATED_DATE < sysdate - 32 
    and rownum < 10 
    order by 1 desc 
    ) 
    START WITH rn = 1 
    CONNECT BY PRIOR rn = rn - 1 
+0

Que mon ami, c'est parce que je suis trop novice pour connaître beautés comme 'sys_connect_by_path' :) Merci beaucoup beaucoup! Fonctionne comme un charme. F. – filippo

+0

+1, bonne réponse, bonne illustration de CONNECT BY PRIOR. J'ai essayé ceci sur une table que j'ai et cela ne donne pas la même réponse que OP, mais je pense que le concept est correct et je n'ai pas le temps de le déboguer. – DCookie

+0

ops ... Je pense que ce serait prévisible mais j'ai cette erreur 'ORA-01489' (la chaîne de sortie est trop longue). Eh bien, je pense qu'il vaudrait mieux traiter de cela dans le code, mais, au cas où, auriez-vous une suggestion à faire à ce sujet? – filippo

1

si vous êtes sur Oralce 11 r2 vous pouvez utiliser LISTAGG pour faire exactement ce http://download.oracle.com/docs/cd/E14072_01/server.112/e10592/functions087.htm

mais ce site a comment vous pouvez le faire une toute version (mais vous devez être> = 9i de le faire en pur SQL avec 11R2 étant idéal): http://www.oracle-base.com/articles/misc/StringAggregationTechniques.php (spécifiquement regarder ROW_NUMBER() et les fonctions de SYS_CONNECT_BY_PATH dans Oracle 9i pour un pur sql)

0

Une autre option serait de définir certaines variables d'entrée/sortie et au lieu de return affecter votre valeur de résultat à une variable de sortie.