2009-05-15 10 views
1

La façon standard dont nos applications transmettent les informations des procédures Oracle stockées au fournisseur .net oracle est via un paramètre de curseur out ref.Oracle - Comment avoir un paramètre de curseur out ref dans une procédure stockée?

Dans le passé, toutes nos procédures stockées utilisées pour être en paquets et avait quelque chose comme ceci:

CREATE OR REPLACE PACKAGE test_package IS 
    TYPE refcur IS REF CURSOR; 
    PROCEDURE get_info (o_cursor   OUT  refcur); 
END test_package; 
/
CREATE OR REPLACE PACKAGE BODY test_package IS 
    PROCEDURE get_info (o_cursor   OUT  refcur) AS 
    BEGIN 
    OPEN o_cursor FOR 
     SELECT * FROM v$database; 
    END get_info; 
END test_package; 
/

Maintenant, je voudrais passer cette procédure get_info de l'emballage et dans une procédure régulière mais ne Je ne sais pas quoi faire pour obtenir le type de refcur. Comment puis-je le créer en dehors de la portée du package?

CRÉER OU REMPLACER TYPE refcur IS REF CURSEUR;

ne fonctionne pas.

Répondre

8

Je ne peux pas le tester ici (pas Oracle) mais vous pouvez faire:

create or replace procedure get_info(p_cursor out sys_refcursor) 
is 
begin 
    open p_cursor for 
    select * 
    from v$database; 
end; 
/

Dans Oracle 9 et plus, il n'a plus besoin de déclarer TYPE EST result_crsr REF CURSOR

Utilisez sys_refcursor à la place.

0
TYPE result_crsr IS REF CURSOR; 

Un exemple de bloc anonyme de SQL à l'aide d'un curseur ref:

DECLARE 
    TYPE result_crsr IS REF CURSOR; 
    crsr_test_result result_crsr; 
BEGIN 


    OPEN crsr_test_result FOR 
     SELECT * from user_objects; 
    ? := crsr_test_result; 
END; 
+0

? : = La ligne crsr_test_result est parce qu'une application Java JDBC appelle ce bloc de sql et obtient le curseur ref. C'est ma technique de raccourci quand je veux accomplir quelque chose avec pl/sql de Java sans placer la logique dans une procédure stockée. Mais il pourrait tout aussi bien être une procédure stockée. –

+0

Je ne pense pas que cela puisse être car il doit y avoir un paramètre de type refcur qui est en dehors de la portée dans laquelle vous créez le type. –

0

Essayez ceci:

CREATE OR REPLACE PROCEDURE get_info(o_cursor OUT sys_refcursor) IS 
BEGIN 
    OPEN o_cursor FOR SELECT * FROM dual; 
END; 
/

Votre question a soulève deux questions importantes:

1) Vous dites "ça ne marche pas". Je prends cela pour signifier qu'Oracle renvoie une exception lorsque vous exécutez la déclaration. Quel est le message d'erreur qu'Oracle renvoie? Il devrait commencer par ORA-nnnnn et être suivi par du texte.

2) À quoi servirait le retrait d'une procédure d'un PAQUET? Il y a quelques autres lignes de code avec le paquet, la signature de la procédure est répétée à la fois dans la spécification du paquet et dans le corps du paquet, mais avoir la procédure dans un paquet fournit plusieurs avantages importants.

+0

Q1: ERROR ligne 1, col 23, ending_line 1, ending_col 25, trouvé 'REF', Attend : ARRAY OBJECT TABLE OPAQUE VARRAY VARIANTE Q2 - il n'y a que quelques procédures stockées utilisées par cette application et ils sont tous déplacés vers un nouvel utilisateur Oracle semble inutile d'avoir des paquets impliqués –

Questions connexes