sql >> Database >  >> RDS >> Oracle

Hoe kan ik een functie maken om de kolomnaam (-namen) van een beperking te retourneren?

U kunt SYS_REFCURSOR . gebruiken in plaats van een standaard intern gegevenstype zoals VARCHAR2 zoals in uw geval om meerdere rijen te kunnen retourneren. Een SELECT-instructie met een INTO-clausule kan niet meerdere rijen retourneren, en het huidige foutbericht (ORA-01422 ) slingert.

Maak dus een opgeslagen functie met SYS_REFCURSOR eerst :

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

en bel vervolgens vanuit de SQL Developer's console als

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

SQL> PRINT wConsumable ;
  • De eerste SQL (voorbereid voor CURSOR Extract_KEY ) is overbodig;
  • Er is geen verschil tussen twee SELECT statements binnen de LOOP ,btw LOOP is niet nodig bij gebruik van dit huidige geval;
  • Het commando PRINT kan worden gebruikt in plaats van DBMS_OUTPUT.PUT_LINE om het resultaat van een SYS_REFCURSOR . te retourneren .


  1. yii2 hoe zoeken te gebruiken met sqldataProvider

  2. Factuur tafel ontwerp

  3. Hoe kan ik een Oracle-functie uitvoeren vanuit een LINQ-expressie in Entity Framework 4?

  4. PHP MYSQLi gebruiken om alleen debiteuren en alleen crediteuren te beheren met action_type DR en CR