Vous pouvez utiliser SYS_REFCURSOR
au lieu d'un type de données interne standard tel que VARCHAR2
comme dans votre cas afin de pouvoir retourner plusieurs lignes. Une instruction SELECT avec une clause INTO ne peut pas renvoyer plusieurs lignes et le message d'erreur actuel (ORA-01422
) lance.
Ainsi, créez une fonction stockée contenant SYS_REFCURSOR
d'abord :
SQL> CREATE OR REPLACE FUNCTION GET_CONSTRAINT_COLUMNS(iTableName IN VARCHAR2,
iConstraintName IN VARCHAR2)
RETURN SYS_REFCURSOR AS
wkeys SYS_REFCURSOR;
v_sql VARCHAR2(32767);
BEGIN
v_sql := 'SELECT column_name
FROM user_cons_columns
WHERE constraint_name = :ic
AND table_name = :it';
OPEN wkeys FOR v_sql USING iconstraintname, iTableName;
RETURN wkeys;
END;
/
puis appelez depuis la console du développeur SQL en tant que
SQL> DECLARE
wConsumable SYS_REFCURSOR;
BEGIN
:wConsumable := GET_CONSTRAINT_COLUMNS('PRODUCTS', 'PRODUCTSPK');
END;
/
SQL> PRINT wConsumable ;
- Le premier SQL (préparé pour
CURSOR Extract_KEY
) est redondant ; - Il n'y a pas de différence entre deux
SELECT
instructions dans laLOOP
, d'ailleursLOOP
n'est pas nécessaire en utilisant ce cas actuel ; - La commande
PRINT
peut être utilisé à la place deDBMS_OUTPUT.PUT_LINE
afin de retourner le résultat d'unSYS_REFCURSOR
.