Oracle
 sql >> база данни >  >> RDS >> Oracle

Как мога да направя функция, която да връща име(на) на колона(а) на ограничение?

Можете да използвате 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 .


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle SQL вмъква множество редове и връща нещо

  2. Конфигуриране на Pentaho Data Integration за използване на Oracle Wallet за Oracle Cloud

  3. Изберете групово събиране в пример на Oracle

  4. Създаване на тригер, който хвърля изключение при вмъкване

  5. Уеб приложението Azure PHP 7 има ли драйвери на Oracle?