sql >> Databasteknik >  >> RDS >> Oracle

Välja Oracle-objekt med samling av objekt utan bulksamling

Du har flera alternativ här. Du kan öppna din fråga som en explicit markör och sedan HÄMTA ... BULK SAMLA IN i en lämplig samling; du kan använda EXECUTE IMMEDIATE...BULK COLLECT INTO; eller, som du säger att du inte vill höra, kan du använda DBMS_SQL.

För att använda EXECUTE IMMEDIATE...BULK COLLECT skulle du använda något liknande

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 här

dokument här (från 10.1 - bättre skrivning än senare versioner IMO)



  1. Hur man får id för valt tabellobjekt i php

  2. CTE-fel:Typerna matchar inte mellan ankaret och den rekursiva delen

  3. Beräkna delta (skillnaden mellan nuvarande och föregående rad) i sql

  4. Hur konfigurerar jag Java Hibernate för Google Cloud SQL?