web-dev-qa-db-fra.com

Obtenir l'ensemble de résultats à partir de la procédure stockée Oracle

Je travaille sur la conversion d'une procédure stockée de SQL Server vers Oracle. Cette procédure stockée fournit un jeu de résultats direct. Je veux dire que si vous appelez la procédure stockée dans par exemple Management Studio, vous obtenez directement le jeu de résultats.

En convertissant en Oracle, je marche contre le problème que je n'afficherai pas le jeu de résultats dans Oracle

J'ai cherché sur Internet et j'ai vu que la procédure stockée devrait produire un REF CURSOR, mais je continue à marcher avec le problème pour écrire un petit morceau de code pour obtenir le jeu de résultats et le traiter.

Pseudo code:

Appeler la procédure stockée et obtenir le curseur Faites quelque chose avec ce curseur pour que mon jeu de résultats apparaisse

Quelqu'un a une idée?

36
jwdehaan

Dans SQL Plus:

SQL> create procedure myproc (prc out sys_refcursor)
  2  is
  3  begin
  4     open prc for select * from emp;
  5  end;
  6  /

Procedure created.

SQL> var rc refcursor
SQL> execute myproc(:rc)

PL/SQL procedure successfully completed.

SQL> print rc

     EMPNO ENAME      JOB              MGR HIREDATE           SAL       COMM     DEPTNO
---------- ---------- --------- ---------- ----------- ---------- ---------- ----------
      7839 KING       PRESIDENT            17-NOV-1981       4999                    10
      7698 BLAKE      MANAGER         7839 01-MAY-1981       2849                    30
      7782 CLARKE     MANAGER         7839 09-JUN-1981       2449                    10
      7566 JONES      MANAGER         7839 02-APR-1981       2974                    20
      7788 SCOTT      ANALYST         7566 09-DEC-1982       2999                    20
      7902 FORD       ANALYST         7566 03-DEC-1981       2999                    20
      7369 SMITHY     CLERK           7902 17-DEC-1980       9988         11         20
      7499 ALLEN      SALESMAN        7698 20-FEB-1981       1599       3009         30
      7521 WARDS      SALESMAN        7698 22-FEB-1981       1249        551         30
      7654 MARTIN     SALESMAN        7698 28-SEP-1981       1249       1400         30
      7844 TURNER     SALESMAN        7698 08-SEP-1981       1499          0         30
      7876 ADAMS      CLERK           7788 12-JAN-1983       1099                    20
      7900 JAMES      CLERK           7698 03-DEC-1981        949                    30
      7934 MILLER     CLERK           7782 23-JAN-1982       1299                    10
      6668 Umberto    CLERK           7566 11-JUN-2009      19999          0         10
      9567 ALLBRIGHT  ANALYST         7788 02-JUN-2009      76999         24         10
64
Tony Andrews

Oracle n'est pas un serveur SQL. Essayez ce qui suit dans SQL Developer

variable rc refcursor;
exec testproc(:rc2);
print rc2
4
softveda

Ma solution était de créer une fonction en pipeline. Les avantages sont que la requête peut être une seule ligne:

  • select * from table(yourfunction(param1, param2));
  • Vous pouvez joindre vos résultats à d'autres tableaux ou les filtrer ou les trier à votre guise.
  • les résultats apparaissent comme des résultats de requête réguliers afin que vous puissiez les manipuler facilement.

Pour définir la fonction, vous devez faire quelque chose comme ceci:

  -- Declare the record columns
  TYPE your_record IS RECORD(
     my_col1 VARCHAR2(50), 
     my_col2 varchar2(4000)
  );
  TYPE your_results IS TABLE OF your_record;

  -- Declare the function
  function yourfunction(a_Param1 varchar2, a_Param2 varchar2)
  return your_results pipelined is
    rt          your_results;
  begin
    -- Your query to load the table type
    select s.col1,s.col2
    bulk collect into rt
    from your_table s
    where lower(s.col1) like lower('%'||a_Param1||'%');

    -- Stuff the results into the pipeline..
    if rt.count > 0 then 
      for i in rt.FIRST .. rt.LAST loop 
        pipe row (rt(i)); 
      end loop; 
    end if;

    -- Add more results as you please....
    return;
  end find;

Et comme mentionné ci-dessus, tout ce que vous feriez pour voir vos résultats est:

select * from table(yourfunction(param1, param2)) t order by t.my_col1;
2
AnthonyVO

Salut, je sais que cela a été demandé il y a un certain temps, mais je viens de comprendre cela et cela pourrait aider quelqu'un d'autre. Je ne sais pas si c'est exactement ce que vous recherchez, mais voici comment j'appelle un proc stocké et affiche la sortie à l'aide de SQL Developer.
Dans SQL Developer lors de la visualisation du proc, cliquez avec le bouton droit et choisissez "Exécuter" ou sélectionnez Ctrl + F11 pour afficher la fenêtre Exécuter PL/SQL. Cela crée un modèle avec les paramètres d'entrée et de sortie que vous devez modifier. Mon proc renvoie un sys_refcursor. La partie délicate pour moi était de déclarer un type de ligne qui est exactement équivalent à la sélection stmt/sys_refcursor retournée par le proc:

DECLARE
  P_CAE_SEC_ID_N NUMBER;
  P_FM_SEC_CODE_C VARCHAR2(200);
  P_PAGE_INDEX NUMBER;
  P_PAGE_SIZE NUMBER;
  v_Return sys_refcursor;
  type t_row is record (CAE_SEC_ID NUMBER,FM_SEC_CODE VARCHAR2(7),rownum number, v_total_count number);
  v_rec t_row;

BEGIN
  P_CAE_SEC_ID_N := NULL;
  P_FM_SEC_CODE_C := NULL;
  P_PAGE_INDEX := 0;
  P_PAGE_SIZE := 25;

  CAE_FOF_SECURITY_PKG.GET_LIST_FOF_SECURITY(
    P_CAE_SEC_ID_N => P_CAE_SEC_ID_N,
    P_FM_SEC_CODE_C => P_FM_SEC_CODE_C,
    P_PAGE_INDEX => P_PAGE_INDEX,
    P_PAGE_SIZE => P_PAGE_SIZE,
    P_FOF_SEC_REFCUR => v_Return
  );
  -- Modify the code to output the variable
  -- DBMS_OUTPUT.PUT_LINE('P_FOF_SEC_REFCUR = ');
  loop
    fetch v_Return into v_rec;
    exit when v_Return%notfound;
    DBMS_OUTPUT.PUT_LINE('sec_id = ' || v_rec.CAE_SEC_ID || 'sec code = ' ||v_rec.FM_SEC_CODE);
  end loop;

END;
1
Ciaran Bruen

Dans SQL Plus:

SQL> var r refcursor
SQL> set autoprint on
SQL> exec :r := function_returning_refcursor();

Remplacez la dernière ligne par un appel à votre procédure/fonction et le contenu du refcursor sera affiché

1
stjohnroe