sql >> Base de Datos >  >> RDS >> Oracle

Seleccionar objeto de Oracle con colección de objetos sin recolección masiva

Tienes varias opciones aquí. Puede abrir su consulta como un cursor explícito y luego FETCH...BULK COLLECT INTO una colección apropiada; puede usar EJECUTAR INMEDIATAMENTE... RECOGER EN GRANEL EN; o, como dices que no quieres escuchar, puedes usar DBMS_SQL.

Para usar EJECUTAR INMEDIATO... RECOGIDA A GRANEL, usaría algo como

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 aquí

documentos aquí (desde 10.1 - mejor redacción que versiones posteriores de la OMI)