sql >> Databáze >  >> RDS >> Oracle

Jak mohu vytvořit funkci, která vrátí názvy sloupců omezení?

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 SELECT není žádný rozdíl příkazy v rámci LOOP , mimo jiné LOOP není potřeba při použití tohoto aktuálního případu;
  • Příkaz PRINT lze použít místo DBMS_OUTPUT.PUT_LINE aby se vrátil výsledek SYS_REFCURSOR .


  1. Tomcat JDBC MySQL ClassNotFoundException

  2. Jak zjistím výchozí znakovou sadu serveru v mysql?

  3. Spuštění uložené procedury Oracle ze serveru SQL Server 2005

  4. Vytvoření clusteru Docker Swarm Cluster ve službě Azure Container Service