Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jak sprawić, by funkcja zwracała nazwy kolumn ograniczenia?

Możesz użyć SYS_REFCURSOR zamiast standardowych wewnętrznych typów danych, takich jak VARCHAR2 tak jak w twoim przypadku, aby móc zwrócić wiele wierszy. Instrukcja SELECT z klauzulą ​​INTO nie może zwrócić wielu wierszy i bieżącego komunikatu o błędzie (ORA-01422 ) miota.

Dlatego utwórz przechowywaną funkcję zawierającą SYS_REFCURSOR po pierwsze :

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 następnie wywołaj z konsoli SQL Developer jako

SQL> DECLARE
    wConsumable SYS_REFCURSOR;
BEGIN
   :wConsumable := GET_CONSTRAINT_COLUMNS('PRODUCTS',  'PRODUCTSPK');
END;
/

SQL> PRINT wConsumable ;
  • Pierwszy SQL (przygotowany dla CURSOR Extract_KEY ) jest zbędne;
  • Nie ma różnicy między dwoma SELECT instrukcje w LOOP ,btw LOOP nie jest potrzebne przy użyciu tego aktualnego przypadku;
  • Polecenie PRINT może być użyty zamiast DBMS_OUTPUT.PUT_LINE aby zwrócić wynik SYS_REFCURSOR .


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Uzyskanie rzeczywistego planu wykonania w Oracle 11g

  2. Jak korzystać z partycji lub max?

  3. Tworzenie tabeli i wstawianie w ramach tej samej procedury w pl/sql

  4. Jak przekierować wyjście DBMS_OUTPUT.PUT_LINE do pliku?

  5. Jak uzyskać wartość UTC dla SYSDATE w Oracle?