Oracle
 sql >> Base de données >  >> RDS >> Oracle

Sélection d'un objet Oracle avec une collection d'objets sans collecte en masse

Vous avez plusieurs options ici. Vous pouvez ouvrir votre requête en tant que curseur explicite, puis FETCH...BULK COLLECT INTO une collection appropriée ; vous pouvez utiliser EXECUTE IMMEDIATE...BULK COLLECT INTO ; ou, comme vous dites que vous ne voulez pas entendre, vous pouvez utiliser DBMS_SQL.

Pour utiliser EXECUTE IMMEDIATE...BULK COLLECT, vous utiliseriez quelque chose comme

CREATE TABLE DATA_TABLE(FIELD1         NUMBER,
                        FIELD2         VARCHAR2(100));

INSERT INTO DATA_TABLE (FIELD1, FIELD2)
  SELECT 1, 'ONE' FROM DUAL UNION ALL
  SELECT 1, 'TWO' FROM DUAL UNION ALL
  SELECT 2, 'THREE' FROM DUAL UNION ALL
  SELECT 2, 'FOUR' FROM DUAL UNION ALL
  SELECT 3, 'LAST' FROM DUAL;

DECLARE
  TYPE typeCol IS TABLE OF DATA_TABLE%ROWTYPE;
  colVals        typeCol;
  strField_name  VARCHAR2(30) := 'FIELD1';
  nField_val     NUMBER := 2;

  strQuery       VARCHAR2(4000);
BEGIN
  strQuery := 'SELECT * FROM DATA_TABLE WHERE ' || strField_name || '=' || nField_val;

  DBMS_OUTPUT.PUT_LINE(strQuery);

  EXECUTE IMMEDIATE strQuery BULK COLLECT INTO colVals;

  FOR i IN colVals.FIRST..colVals.LAST LOOP
    DBMS_OUTPUT.PUT_LINE(i || ': FIELD1=' || colVals(i).FIELD1 || '  FIELD2=' || colVals(i).FIELD2);
  END LOOP;
END;
/

dbfiddle ici

docs ici (à partir de 10.1 - meilleure rédaction que versions ultérieures IMO)