salida - procedure oracle ejemplos
Obtener resultados del procedimiento almacenado de Oracle (5)
En 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
Estoy trabajando en la conversión de un procedimiento almacenado de SQL Server a Oracle. Este procedimiento almacenado proporciona un resultado directo. Quiero decir que si llamas al procedimiento almacenado en, por ejemplo, Management Studio, obtienes directamente el resultado.
Al convertirme en Oracle, camino contra el problema de que en Oracle no mostraré el conjunto de resultados.
Busqué en Internet y he visto que el procedimiento almacenado debería producir un CURSOR DE REF, pero sigo caminando con el problema para escribir un pequeño fragmento de código para obtener el conjunto de resultados en proceso.
Pseudo Código:
Llamar al procedimiento almacenado y obtener el cursor Hacer algo con ese cursor para que aparezca mi conjunto de resultados
Alguien una idea?
En SQL Plus:
SQL> var r refcursor
SQL> set autoprint on
SQL> exec :r := function_returning_refcursor();
Reemplace la última línea con una llamada a su procedimiento / función y se mostrará el contenido del refcursor
Hola, sé que esto fue preguntado hace un tiempo, pero acabo de descubrirlo y podría ayudar a alguien más. No estoy seguro de si esto es exactamente lo que está buscando, pero así es como llamo a un proceso almacenado y veo el resultado usando SQL Developer.
En SQL Developer al ver el proceso, haga clic con el botón derecho y seleccione ''Ejecutar'' o seleccione Ctrl + F11 para abrir la ventana Ejecutar PL / SQL. Esto crea una plantilla con los parámetros de entrada y salida que necesita modificar. Mi proceso devuelve un sys_refcursor. La parte más complicada para mí fue declarar un tipo de fila que es exactamente equivalente al select stmt / sys_refcursor que devuelve el proceso:
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;
Mi solución fue crear una función canalizada. Las ventajas son que la consulta puede ser una sola línea:
-
select * from table(yourfunction(param1, param2));
- Puede unir sus resultados a otras tablas o filtrarlas o clasificarlas como desee.
- los resultados aparecen como resultados de consultas regulares para que pueda manipularlos fácilmente.
Para definir la función, necesitarás hacer algo como lo siguiente:
-- 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;
Y como se mencionó anteriormente, todo lo que haría para ver sus resultados es:
select * from table(yourfunction(param1, param2)) t order by t.my_col1;
Oracle no es un servidor SQL. Pruebe lo siguiente en SQL Developer
variable rc refcursor;
exec testproc(:rc2);
print rc2