Můžete použít SYS_REFCURSOR namísto standardních interních datových typů, jako je VARCHAR2 jako ve vašem případě, abyste mohli vrátit více řádků. Příkaz SELECT s klauzulí INTO nemůže vrátit více řádků a aktuální chybovou zprávu (ORA-01422 ) vrhá.
Vytvořte tedy uloženou funkci obsahující SYS_REFCURSOR první :
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;
/
a potom zavolejte z konzoly SQL Developer jako
SQL> DECLARE
wConsumable SYS_REFCURSOR;
BEGIN
:wConsumable := GET_CONSTRAINT_COLUMNS('PRODUCTS', 'PRODUCTSPK');
END;
/
SQL> PRINT wConsumable ;
- První SQL (připravený pro
CURSOR Extract_KEY) je nadbytečný; - Mezi dvěma
SELECTnení žádný rozdíl příkazy v rámciLOOP, mimo jinéLOOPnení potřeba při použití tohoto aktuálního případu; - Příkaz
PRINTlze použít místoDBMS_OUTPUT.PUT_LINEaby se vrátil výsledekSYS_REFCURSOR.