Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Selecionando o objeto Oracle com coleção de objetos sem coleta em massa


Você tem várias opções aqui. Você pode abrir sua consulta como um cursor explícito e então FETCH...BULK COLLECT INTO uma coleção apropriada; você pode usar EXECUTE IMMEDIATE... BULK COLLECT IN; ou, como você diz que não quer ouvir, pode usar DBMS_SQL.

Para usar EXECUTE IMMEDIATE...BULK COLLECT você usaria 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 aqui

documentos aqui (de 10.1 - melhor redação do que versões posteriores IMO)