Voici un exemple pratique, déclarez le refcursor puis affectez la valeur en appelant proc dans un bloc anonyme. vous l'imprimer
var x REFCURSOR ;
declare
/*a no cleanup procedure*/
procedure GetMeMyRefCursor(outter out nocopy sys_refcursor)
as
begin
open outter for
select level
from dual
connect by level <= 5;
end GetMeMyRefCursor;
begin
GetMeMyRefCursor(:x);
/*note you pass in the refcursor you created via the :X*/
end ;
/
print x;
/*now print it*/
/*LEVEL
----------------------
1
2
3
4
5*/
basé sur le commentaire: maintenant avec votre commentaire, vous rencontrez un problème avec params IN/OUT et non avec l'impression (n'a pas lu le titre juste la question et l'autre réponse)
cela fonctionne: (en fonction de votre code)
create or replace
PROCEDURE GET_PROJECT_DRF_HISTORY
(projectId IN NUMBER,
resultset_out OUT sys_refcursor
) AS
BEGIN
OPEN resultset_out for
SELECT level from dual connect by level <= projectId;
/* DBMS_OUTPUT.PUT_LINE(resultset_out);*/
END GET_PROJECT_DRF_HISTORY;
/
var results REFCURSOR;
--this needs to be REFCURSOR (at least in 10g and 11i)
exec GET_PROJECT_DRF_HISTORY(5, :results);
print results;
/
vous pouvez également les paquets de débogage et procédures directement à partir de SQL Developer (cela peut être un épargnant de vie réelle) si vous voulez déboguer en S QL Developer il est vraiment facile:
dans le Connexions-> votre schéma ici -> Procédures -> GET_PROJECT_DRF_HISTORY clic droit et 'Compiler pour le débogage. Ensuite, dans le lieu de procédure un point de rupture dans, puis faites un clic droit et « debug » (cela va créer un bloc anonyme - voir ci-dessous - où vous pouvez mettre dans vos valeurs et telles)
DECLARE
PROJECTID NUMBER;
RESULTSET_OUT sys_refcursor;
BEGIN
PROJECTID := NULL;
GET_PROJECT_DRF_HISTORY(
PROJECTID => PROJECTID,
RESULTSET_OUT => RESULTSET_OUT
);
-- Modify the code to output the variable
-- DBMS_OUTPUT.PUT_LINE('RESULTSET_OUT = ' || RESULTSET_OUT);
END;
(http://www.oracle.com/technetwork/developer-tools/sql-developer/sqldeveloperwhitepaper-v151-130908.pdf page 11)
sinon, l'erreur ne semble pas comme cela devrait apparaître si vous faites tout cela à partir de Developer.
Mais ce que je pense vraiment est que votre VAR est incorrect et donc il n'existe pas!
variable results sys_refcursor;
Usage: VAR[IABLE] [ <variable> [ NUMBER | CHAR | CHAR (n [CHAR|BYTE]) |
VARCHAR2 (n [CHAR|BYTE]) | NCHAR | NCHAR (n) |
NVARCHAR2 (n) | CLOB | NCLOB | REFCURSOR |
BINARY_FLOAT | BINARY_DOUBLE ] ]
donc, en partant de mon exemple initial "var x REFCURSOR;" devraient travailler
Je ne comprends pas le commentaire sur le fait de ne pas pouvoir utiliser SQL * Plus. Le mot de passe ne serait-il pas le même que le mot de passe utilisé avec SQL Developer? –
Je suppose que le mot de passe est probablement dans l'un des fichiers de config pour Sql Developer. Fondamentalement, je n'arrive jamais à taper le mot de passe lorsque j'utilise Sql Developer. – sammy
Avez-vous essayé d'utiliser "set autoprint on" avant l'exec à la place et en l'exécutant comme un script? (F5) –