Можете да използвате SYS_REFCURSOR вместо стандартни вътрешни типове данни като VARCHAR2 както във вашия случай, за да можете да върнете няколко реда. Оператор SELECT с клауза INTO не може да върне множество редове и текущото съобщение за грешка (ORA-01422 ) хвърля.
Така създайте съхранена функция, съдържаща SYS_REFCURSOR първо :
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;
/
и след това извикайте от конзолата на SQL Developer като
SQL> DECLARE
wConsumable SYS_REFCURSOR;
BEGIN
:wConsumable := GET_CONSTRAINT_COLUMNS('PRODUCTS', 'PRODUCTSPK');
END;
/
SQL> PRINT wConsumable ;
- Първият SQL (подготвен за
CURSOR Extract_KEY) е излишен; - Няма разлика между два
SELECTизрази в рамките наLOOP,между друготоLOOPне е необходимо при използване на този текущи случай; - Командата
PRINTможе да се използва вместоDBMS_OUTPUT.PUT_LINEза да върне резултата отSYS_REFCURSOR.