Dans MS SQL Server, si je souhaite vérifier les résultats d'une procédure stockée, il se peut que j'exécute ce qui suit dans Management Studio.Comment obtenez-vous des résultats bien formatés à partir d'une procédure Oracle qui renvoie un curseur de référence?
--SQL SERVER WAY
exec sp_GetQuestions('OMG Ponies')
La sortie dans le volet de résultats peut ressembler à ceci.
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)
Pas besoin d'écrire des boucles ou des instructions PRINT.
Pour faire la même chose dans Oracle je pourrais exécuter le bloc anonyme suivant dans 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;
Ce sorties comme
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
Ainsi, la version SQL a 1 ligne et l'oracle a 18 et la sortie est moche. C'est exacerbé s'il y a beaucoup de colonnes et/ou les données sont numériques.
Ce qui est étrange pour moi à ce sujet est que si j'écris cette déclaration soit dans SQL Developer ou un studio de gestion ...
SELECT
ID,
Title,
ViewCount,
Votes
FROM votes where user = 'OMG Ponies'
Les résultats sont assez similaires. Cela me donne l'impression de manquer une technique ou d'utiliser le mauvais outil.
La version de SQL Server n'est probablement pas une fonction. Dans SQL Server, les procédures stockées qui retournent ensemble comme résultats ont simplement des instructions 'select' qui ne sont pas liées à un curseur. Obtenir les résultats de l'exécution d'une telle procédure stockée revient à obtenir les résultats d'une requête 'select' du côté client. –
Je devrais apprendre à propos de SQL Server un jour. On dirait que l'équivalent serait une fonction qui renvoie un refcursor, plutôt qu'une procédure avec un paramètre 'OUT', donc il peut être utilisé dans une requête de plan SQL? –
MyPackage.GetQuestions est une procédure. par exemple. PROCEDURE GETQUETSIONS (sortie IN OUT MYPACKAGE.refcur_question, utilisateur IN VARCHAR2). Quand j'ai lié votre technique, je reçois des erreurs d'identifiants invalides –