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

Selezione dell'oggetto Oracle con raccolta di oggetti senza raccolta in blocco

Hai diverse opzioni qui. È possibile aprire la query come cursore esplicito e quindi FETCH...BULK COLLECT INTO una raccolta appropriata; puoi usare ESEGUI IMMEDIATO... BULK COLLECT INTO; oppure, come dici di non voler sentire, puoi usare DBMS_SQL.

Per usare ESEGUI IMMEDIATO... COLLEZIONE IN BLOCCO dovresti usare qualcosa come

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 qui

documenti qui (da 10.1 - meglio scrivere di versioni successive IMO)