2010-09-21 22 views
0

Je rencontre des difficultés pour tester cette procédure stockée simple dans Oracle Sql Developer. La procédure stockée effectue une sélection simple et renvoie un curseur.Oracle SQL Developer - Paramètre IN ou OUT manquant à l'index :: 1

create or replace 
PROCEDURE GET_PROJECT_DRF_HISTORY 

(projectId IN NUMBER, 
    resultset_out OUT sys_refcursor 
) AS 

BEGIN 

    OPEN resultset_out for 
    SELECT * from GLIDE_HISTORY 
    where GLIDE_HISTORY.PRJ_ID = projectId; 
/* DBMS_OUTPUT.PUT_LINE(resultset_out);*/ 

END GET_PROJECT_DRF_HISTORY; 

Pour tester cette procédure, je le script ci-dessous:

variable results sys_refcursor; 

exec get_project_drf_history(3345, :results); 

print :results; 

Être nouvelle à la fois Oracle et l'outil de développement Sql, je me bats pour comprendre ce qui est le erreur ici. Je ne peux pas vérifier ceci dans Sql * Plus parce que je n'ai pas le mot de passe pour le faire. J'utilise Oracle Sql Developer 1.1.2.25 et Oracle 10g.

Quelqu'un peut-il m'aider s'il vous plaît? Merci d'avance.

+1

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? –

+0

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

+0

Avez-vous essayé d'utiliser "set autoprint on" avant l'exec à la place et en l'exécutant comme un script? (F5) –

Répondre

0

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

+0

Est-ce différent de ce que j'ai fait? – sammy

+0

@sammy, j'ai ajouté plus haut, mais je crois que vous initialisez la variable de façon incorrecte (var x REFCURSOR;) NOT var x SYS_REFCURSOR; – Harrison

+0

Merci pour la réponse détaillée. J'aimerais que ce soit le problème. Le changement de REFCURSOR n'a pas fonctionné non plus. – sammy

1

Sammy,

La déclaration variable doit être refcursor au lieu de sys_refcursor. De même, lorsque vous imprimez les résultats, vous imprimez la variable elle-même. Aucun : (utilisé pour indiquer qu'il s'agit d'une variable de rattachement) n'est donc nécessaire.

J'ai pu exécuter le script suivant avec succès dans SQL Developer (et bien sûr sql plus.) Pour SQL Developer, exécutez-le en tant que script à l'aide de F5.

--Creating Procedure 
create or replace procedure test_ref(
i_limit number, 
o_results out sys_refcursor 
) is 
begin 
    open o_results for 
     'select object_name 
     from all_objects 
     where rownum < ' || i_limit; 
end; 
/

Puis le script qui appelle cette procédure. (excute comme un script en utilisant F5).

var c1 refcursor; 

exec test_ref(10,:c1); 

print c1; 
+0

Merci pour la réponse. J'ai fait les changements comme vous le conseilliez mais toujours pas de chance :-( – sammy

+0

J'ai effectivement couru ce code dans le développeur sql et j'ai pu voir les résultats, je ne sais pas ce qui n'allait pas chez vous, avez-vous essayé les extraits de code fournis? ? (Vous pouvez les exécuter avec à la création d'une table) –

+0

je suis en mesure d'exécuter votre code exact aussi .. "résultats variables refcursor; exec get_project_drf_history (3345,: résultats); résultats d'impression;". A travaillé –

0

Je recommande de demander à votre administrateur de mettre à jour votre version de SQL Developer. Le vôtre est considérablement dépassé et vous risquez de rencontrer des bugs obscurs. (J'ai fait quand j'ai essayé d'utiliser la version 1) Vous devriez être sur 2.1 maintenant.