Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Auswählen eines Oracle-Objekts mit Sammlung von Objekten ohne Massenerfassung

Sie haben hier mehrere Möglichkeiten. Sie können Ihre Abfrage als expliziten Cursor öffnen und dann FETCH...BULK COLLECT IN eine geeignete Sammlung einfügen; Sie können EXECUTE IMMEDIATE...BULK COLLECT INTO verwenden; oder, wie Sie sagen, Sie wollen es nicht hören, können Sie DBMS_SQL verwenden.

Um EXECUTE IMMEDIATE...BULK COLLECT zu verwenden, würden Sie etwas wie

verwenden
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 hier

Dokumente hier (ab 10.1 - bessere Beschreibung als spätere Versionen IMO)