sql >> Database teknologi >  >> RDS >> Oracle

Hvordan kan jeg lave en funktion til at returnere en begrænsnings kolonnenavn(e)?

Du kan bruge SYS_REFCURSOR i stedet for en standard intern datatype såsom VARCHAR2 som i dit tilfælde for at kunne returnere flere rækker. En SELECT-sætning med en INTO-klausul kan ikke returnere flere rækker og den aktuelle fejlmeddelelse (ORA-01422 ) kaster.

Opret derfor en gemt funktion indeholdende 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;
/

og ring derefter fra SQL-udviklerkonsollen som

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

SQL> PRINT wConsumable ;
  • Den første SQL(forberedt til CURSOR Extract_KEY ) er overflødig;
  • Der er ingen forskel mellem to SELECT sætninger i LOOP ,btw LOOP er ikke nødvendig ved at bruge denne aktuelle sag;
  • Kommandoen PRINT kan bruges i stedet for DBMS_OUTPUT.PUT_LINE for at returnere resultatet af en SYS_REFCURSOR .


  1. Søg efter produkter med flere kriterier

  2. MySQL bruger oprettet midlertidig tabel er fuld

  3. importere en CSV til phpmyadmin

  4. PHP-session + MySQL-ressource