2017-05-22 3 views
0

j'ai créé une fonction qui renvoie une SYS_REFCURSOR,la récupération de données à partir d'un curseur qui vient d'une fonction

FUNCTION read_addresses (person_id NUMBER) 
     RETURN SYS_REFCURSOR 
    IS 
     my_addresses SYS_REFCURSOR; 
    BEGIN 
     OPEN my_addresses FOR 
      SELECT commuter_name, 
        address_line, 
        city_name, 
        lat_lon, 
        my_dist, 
       FROM carpool.addresses addr 
        INNER JOIN CARPOOL.COMMUTERS comm 
         ON addr.COMMUTER_ID = comm.COMMUTER_ID 
        INNER JOIN CARPOOL.CITIES city 
         ON addr.city_id = city.CITY_ID 
        INNER JOIN carpool.coordinates coord 
         ON coord.COORD_ID = addr.COORD_ID 
      WHERE comm.commuter_id = person_id AND addr.is_active = 1; 

     RETURN my_addresses; 
    END read_addresses; 

Et je veux faire un bloc anonyme pour tester cette fonction. Ce que j'ai actuellement:

DECLARE 
    my_cursor SYS_REFCURSOR; 
    my_name  VARCHAR2 (100); 
    my_address VARCHAR2 (100); 
    my_city  VARCHAR2 (100); 
    my_latlon VARCHAR2 (100); 
    my_dist  NUMBER; 
BEGIN 
    my_cursor := carpool.irud.read_addresses (12); 

    OPEN my_cursor; 

    LOOP 
     FETCH my_cursor 
      INTO my_name, 
       my_address, 
       my_city, 
       my_latlon, 
       my_dist; 

     EXIT WHEN my_cursor%NOTFOUND; 
     DBMS_OUTPUT.put_line (my_name); 
    END LOOP; 

    CLOSE my_cursor; 
END; 

Rendements l'erreur suivante: L'expression est de type incorrect sur la ligne 11, colonne 5 (je pense que c'est la

ligne OPEN my_cursor

Que dois-je faire pour tester. cette fonction et voir le contenu du curseur?

J'apprécierai toute aide à ce problème.

Répondre

1

le problème ici est que le curseur est déjà ouvert après avoir appelé la fonction. Il n'y a pas besoin d'écrire OPEN my_cursor. L'élimination de cette ligne résout le problème.