Oracle
 sql >> база данни >  >> RDS >> Oracle

Как да използвате клауза за групово събиране с оператор SELECT INTO в базата данни на Oracle

Клауза за групово събиране с оператор SELECT INTO

Добре дошли във втория урок от серията PL/SQL Bulk Collect, където ще се научим как да използваме клауза BULK COLLECT с оператор SELECT-INTO.

Превключвателите на контекста са добри, но само когато са малко на брой. Увеличеният брой превключвания на контекста може да причини проблеми, като например лоша производителност на заявката. Тези допълнителни разходи, причинени от превключватели на контекста, могат лесно да бъдат контролирани, ако можем да ги компресираме. Точно това ще научите в този урок.

Можете да научите повече за SELECT-INTO тук .

Кога трябва да използваме групово събиране с изявление Select-Into?

Когато сте сигурни, че връщаният резултат от вашия оператор SELECT е малък тогава трябва да използвате клауза Bulk Collect с оператор Select-Into. В противен случай вашата клауза за групово събиране ще направи изявлението ви Select-Into чудовище, което претоварва паметта. Следователно това ще забави производителността на вашата база данни.

Какво трябва да направя, ако моят оператор SELECT извлича огромен брой редове?

Винаги можете да използвате клауза LIMIT заедно с груповото събиране, за да ограничите броя на редовете, извлечени от базата данни. Но това е възможно само когато използваме клаузата Bulk Collect с PL/SQL курсори. Въпреки това ще обсъдим това подробно в следващия урок.

Защо не можем да ограничим данните, извличани чрез групово събиране в израза SELECT-INTO?

Когато използваме клауза за групово събиране с израз SELECT-INTO, тя използва неявно курсор за изпълнение на задачата за групова обработка на данни. Клаузата за ограничение обаче може да се използва само с клауза за групово събиране, когато последната използва Явен курсор за обработка на данни.

Кога клаузата за групово събиране използва имплицитен курсор и кога изрично курсор?

Ако използваме клауза за групово събиране с SQL израз като SELECT-INTO, той използва имплицитен курсор. От друга страна, когато използваме клауза Bulk Collect с израза FETCH, той използва изричен курсор.

Предлагам ви да прочетете как да създадете изричен курсор , за да научите повече за израза FETCH.

Можем ли да съхраняваме резултата, върнат от клаузата за групово събиране, в променлива с примитивен тип данни?

Не, към момента PL/SQL колекциите са единствените поддържащи типове данни за групова обработка на данни с клауза за групово събиране в Oracle Database. В случай, че се опитате да съхраните данните, извлечени с помощта на клауза Bulk Collect, в променлива с тип данни като Char, Number или Varchar2, ще получите грешка, която ще се чете нещо подобно:

„PLS-00497:Не може да се смесва между единичен ред и многоред (BULK) в INTO списък“

Определение за групово събиране в извлечение
Изразът „Групово събиране в“ избира множество данни от колона и ги съхранява в SQL колекция.

Синтаксис на клаузата за групово събиране с оператор Select-Into.

Синтаксисът за използване на клауза за групово събиране на PL/SQL с оператор Select-Into в Oracle Database е както следва:

SELECT column_list
 BULK COLLECT INTO collection_datatype_name 
FROM table_name 
WHERE <where clause> 
ORDER BY <column list>;

Къде:

Списък с колони е списъкът с колони, от които искате да извлечете данните.

Име на типа данни на колекция ще бъде името на променливата за събиране, която ще съдържа данните, върнати от клаузата за групово събиране.

Освен това винаги помнете, че всяка колона, която сте посочили за извличане на данните, трябва да носи съответен тип данни за колекция за съхраняване на тези данни. Тъй като механизмът за изпълнение на PL/SQL винаги съхранява данните, извлечени от колоната, в колекцията по паралелен начин.

Например

SELECT column_1, column_2 BULK COLLECT INTO collection_1, collection2 FROM table;

Тук данните, извлечени от колона_1, ще се съхраняват автоматично в колекция_1, а данните от колона_2 в колекция_2.

Име на таблица може да бъде името на всяка таблица, от която искате да извлечете данните.

След това имаме клауза WHERE и ORDER BY, които не са задължителни, но ако искате, можете да ги използвате.

След като обсъдихме синтаксиса, нека направим прост пример, за да научим как да работим с клауза за групово събиране на PL/SQL с израза SELECT INTO в Oracle Database.

SET SERVEROUTPUT ON;
DECLARE
    TYPE nt_fName   IS TABLE OF VARCHAR2 (20);
    TYPE nt_lName   IS TABLE OF VARCHAR2 (20);
    
    fname   nt_fName;
    lName   nt_lName;
BEGIN
    SELECT first_name, last_name 
        BULK COLLECT INTO fName, lName 
    FROM employees; 
        
        --Print values from the collection--
    FOR idx IN 1..fName.COUNT
    LOOP
        DBMS_OUTPUT.PUT_LINE (idx||' - '||fName (idx) ||' '||lName (idx));
    END LOOP;
END;
/

Обяснение на примера

Тук имаме много прост код, за да демонстрираме как да използвате клауза за групово събиране с оператор Select-Into. В секцията за декларации на този код първо създадохме две колекции тип вложена таблица „nt_fName“ &„nt_lName“ със съответните им променливи на колекция „fName“ &„lName“. Всъщност и двете колекции ще се използват за съхраняване на данните, върнати от оператора Select-Into.

Можете да прочетете как да създадете вложена таблица тук.

В секцията за декларации имаме нашия оператор Select-Into с клауза за групово събиране. Освен това, използвайки тази инструкция Select-Into, ние извличаме всички данни от колоната Име и Фамилия на таблицата на служителите. И с помощта на клаузата за групово събиране ние съхраняваме тези данни в съответните колекции паралелно.

Освен заедно с оператора Select-Into, ние също имаме “For Loop” който отпечатва данните от двете колекции на изходния екран.

Задължително гледане
Не забравяйте да разгледате видеоклипа, където демонстрирах как клаузата за групово събиране компресира множество превключватели на контекст в едно и подобрява производителността на заявката. Ето линка.

Това е урокът, обясняващ подробно концепциите на клаузата за групово събиране с оператор Select-Into. В този урок се опитах да отговоря на всички възможни въпроси, които бихте могли да срещнете по време на изпита си за сертифициране, както и на интервюто.

Надявам се, че ви е харесало четенето. Моля, не забравяйте да СПОДЕЛЕТЕ този блог с приятелите си в социалните си мрежи. Благодаря и приятен ден!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Вмъкване на изображение в BLOB Oracle 10g

  2. Как да получите броя на елементите в JSON масив, съхранен като CLOB с Oracle 12c?

  3. Bool поддръжка на Oracle SQL

  4. как да извикам един съхранен процес от прашник и да модифицирам рекурсора, който се връща?

  5. Има ли начин да принудим OracleCommand.BindByName да бъде истина по подразбиране за ODP.NET?