Bonjour,
j'ai 2 BD, la premier a une procédure appelé print_UF et une DBLINK qui pointe sur la 2eme BD.
Procedure pint_uf
create or replace PROCEDURE print_uf IS
nouf CHAR(10);
CODEUF CHAR(4);
O_RET SYS_REFCURSOR;
BEGIN
GET_UF_DISPOLIT@dblink_xxx(O_RET => O_RET);
LOOP
FETCH O_RET INTO nouf, CODEUF;
EXIT WHEN O_RET%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('-->' || nouf || '--' || CODEUF || '<--' );
END LOOP; END;
et le dblink suivent :
CREATE DATABASE LINK "DBLINK_XXX"
CONNECT TO "user" IDENTIFIED BY "pass"
USING '(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = server42)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = ServerUS4)
)
)';
Et dans la seconde BD il y a une autre procédure
create or replace PROCEDURE get_uf_dispolit (o_Ret OUT SYS_REFCURSOR) AS
v_Sql VARCHAR2(200);
BEGIN
v_Sql:='
SELECT NOUF, CODEUF
FROM UF
';
OPEN o_Ret FOR v_sql;
END;
Quand j'execute la procedure print_uf dans la premier bd, j'ai l'erreur suivent
Connecting to the database TEST_M.
ORA-01001: curseur non valide
ORA-06512: à "MRS.PRINT_UF", ligne 13
ORA-06512: à ligne 2Process exited.
Disconnecting from the database TEST_M.
mais quand j'exécute la même procédure sur la seconde BD (g efface le @dblink) il marche tres tres bien..
Procedure pint_uf
create or replace PROCEDURE print_uf IS
nouf CHAR(10);
CODEUF CHAR(4);
O_RET SYS_REFCURSOR;
BEGIN
GET_UF_DISPOLIT(O_RET => O_RET);
LOOP
FETCH O_RET INTO nouf, CODEUF;
EXIT WHEN O_RET%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('-->' || nouf || '--' || CODEUF || '<--' );
END LOOP; END;
Resultat:
anonymous block completed
-->1000000138--3272<--
-->1000000139--3071<--
-->1000000140--3070<--
-->1000000141--3073<--
-->1000000142--3062<--
-->1000000143--2071<--
-->1000000144--3104<--
-->1000000145--3081<--
On peut utiliser les curseur avec les dblinks?
Ou il y a une autre méthode pour utiliser le curseur?
MERCI BC!
Partager