sql >> Databáze >  >> RDS >> Oracle

Výběr objektu Oracle s kolekcí objektů bez hromadného shromažďování

Zde máte několik možností. Dotaz můžete otevřít jako explicitní kurzor a potom NAČÍST...HROMADNĚ SBÍRAT DO příslušné kolekce; můžete použít EXECUTE IMMEDIATE...BULK COLLECT INTO; nebo, jak říkáte, že nechcete slyšet, můžete použít DBMS_SQL.

Chcete-li použít EXECUTE IMMEDIATE...BULK COLLECT, použijte něco jako

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 zde

dokumenty zde (od 10.1 – lepší zápis než novější verze IMO)



  1. Jak mohu AKTUALIZOVAT řádek v tabulce nebo jej VLOŽIT, pokud neexistuje?

  2. Indexové skenování pro vícesloupcové porovnání - nejednotné řazení indexových sloupců

  3. Základy tabulkových výrazů, Část 11 – Pohledy, úvahy o úpravách

  4. Aliasing názvů polí v modelu SQLAlchemy nebo podkladové tabulce SQL