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?
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
Oracle n'est pas un serveur SQL. Essayez ce qui suit dans SQL Developer
variable rc refcursor;
exec testproc(:rc2);
print rc2
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));
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;
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;
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é