sql >> Databasteknik >  >> RDS >> Oracle

Hur kan jag skapa en funktion för att returnera en begränsnings kolumnnamn?

Du kan använda SYS_REFCURSOR istället för en standard interna datatyper som VARCHAR2 som i ditt fall för att kunna returnera flera rader. En SELECT-sats med en INTO-sats kan inte returnera flera rader och det aktuella felmeddelandet (ORA-01422 ) kastar.

Skapa därför en lagrad funktion som innehåller SYS_REFCURSOR först :

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;
/

och anropa sedan från SQL-utvecklarens konsol som

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

SQL> PRINT wConsumable ;
  • Den första SQL-koden (förberedd för CURSOR Extract_KEY ) är redundant;
  • Det är ingen skillnad mellan två SELECT satser inom LOOP ,btw LOOP behövs inte genom att använda det här aktuella fallet;
  • Kommandot PRINT kan användas istället för DBMS_OUTPUT.PUT_LINE för att returnera resultatet av en SYS_REFCURSOR .


  1. MySQL-prestanda:flera tabeller kontra index på enstaka tabeller och partitioner

  2. Hantera BatchUpdateException med withBatch

  3. Hitta textposition, extrahera text och infoga i ny kolumn i MySQL

  4. Heroku postgresql databasnamn