En MS SQL Server, si deseo verificar los resultados de un procedimiento Almacenado, podría ejecutar lo siguiente en Management Studio.¿Cómo obtiene resultados muy formateados de un procedimiento de Oracle que devuelve un cursor de referencia?
--SQL SERVER WAY
exec sp_GetQuestions('OMG Ponies')
La salida en el panel de resultados podría verse así.
ID Title ViewCount Votes
----- ------------------------------------------------- ---------- --------
2165 Indexed View vs Indexes on Table 491 2
5068 SQL Server equivalent to Oracle’s NULLS FIRST 524 3
1261 Benefits Of Using SQL Ordinal Position Notation? 377 2
(3 row(s) affected)
No es necesario escribir bucles o instrucciones PRINT.
Para hacer lo mismo en Oracle podría ejecutar el siguiente bloque anónimo en SQL Developer
--ORACLE WAY
DECLARE
OUTPUT MYPACKAGE.refcur_question;
R_OUTPUT MYPACKAGE.r_question;
USER VARCHAR2(20);
BEGIN
dbms_output.enable(10000000);
USER:= 'OMG Ponies';
recordCount := 0;
MYPACKAGE.GETQUESTIONS(p_OUTPUT => OUTPUT,
p_USER=> USER,
) ;
DBMS_OUTPUT.PUT_LINE('ID | Title | ViewCount | Votes');
LOOP
FETCH OUTPUT
INTO R_OUTPUT;
DBMS_OUTPUT.PUT_LINE(R_OUTPUT.QUESTIONID || '|' || R_OUTPUT.TITLE
'|' || R_OUTPUT.VIEWCOUNT '|' || R_OUTPUT.VOTES);
recordCount := recordCount+1;
EXIT WHEN OUTPUT % NOTFOUND;
END LOOP;
DBMS_OUTPUT.PUT_LINE('Record Count:'||recordCount);
CLOSE OUTPUT;
END;
Este salidas como
ID|Title|ViewCount|Votes
2165|Indexed View vs Indexes on Table|491|2
5068|SQL Server equivalent to Oracle’s NULLS FIRST|524|3
1261|Benefits Of Using SQL Ordinal Position Notation?|377|2
Record Count: 3
Así que la versión de SQL tiene 1 línea y el oráculo tiene 18 y la salida es fea Se agrava si hay muchas columnas y/o los datos son numéricos.
Lo que es extraño para mí de esto es que si escribo esta declaración, ya sea en el estudio de administración de SQL Developer o ...
SELECT
ID,
Title,
ViewCount,
Votes
FROM votes where user = 'OMG Ponies'
Los resultados son bastante similares. Esto me hace sentir que me falta una técnica o uso la herramienta incorrecta.
La versión de SQL Server probablemente no sea una función. En SQL Server, los procedimientos almacenados que retornan como resultados solo tienen sentencias 'select' que no están unidas a un cursor. Obtener los resultados de la ejecución de dicho procedimiento almacenado es lo mismo que obtener los resultados de una consulta 'select' en el lado del cliente. –
Debería aprender sobre SQL Server algún día. Parece que el equivalente sería una función que devuelve un refcursor, en lugar de un procedimiento con un parámetro 'OUT', por lo que se puede utilizar en una consulta del plan SQL. –
MyPackage.GetQuestions es un procedimiento. p.ej. GETQUETSIONS DE PROCEDIMIENTO (salida IN OUT MYPACKAGE.refcur_question, usuario IN VARCHAR2). Cuando até su técnica recibo errores de identificador no válido –