Sie können SYS_REFCURSOR
verwenden anstelle eines standardmäßigen internen Datentyps wie VARCHAR2
wie in Ihrem Fall, um mehrere Zeilen zurückgeben zu können. Eine SELECT-Anweisung mit einer INTO-Klausel kann nicht mehrere Zeilen zurückgeben, und die aktuelle Fehlermeldung (ORA-01422
) schleudert.
Erstellen Sie daher eine gespeicherte Funktion, die SYS_REFCURSOR
enthält zuerst :
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;
/
und rufen Sie dann von der Konsole des SQL-Entwicklers als
aufSQL> DECLARE
wConsumable SYS_REFCURSOR;
BEGIN
:wConsumable := GET_CONSTRAINT_COLUMNS('PRODUCTS', 'PRODUCTSPK');
END;
/
SQL> PRINT wConsumable ;
- Das erste SQL(vorbereitet für
CURSOR Extract_KEY
) ist überflüssig; - Es gibt keinen Unterschied zwischen zwei
SELECT
Anweisungen innerhalb derLOOP
,übrigensLOOP
wird in diesem Fall nicht benötigt; - Der Befehl
PRINT
kann anstelle vonDBMS_OUTPUT.PUT_LINE
verwendet werden um das Ergebnis einesSYS_REFCURSOR
zurückzugeben .