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
SELECTinstructions dans laLOOP, d'ailleursLOOPn'est pas nécessaire en utilisant ce cas actuel ; - La commande
PRINTpeut être utilisé à la place deDBMS_OUTPUT.PUT_LINEafin de retourner le résultat d'unSYS_REFCURSOR.