21
1 Tabulas TABLE() datu funkcija Tabulas funkcijas ir lietotāja definētas PL/SQL funkcijas, kas atgriež rindu kolekciju: 1) asociatīvu masīvu; 2) ligzdtabulu; 3) masīvu (varray)). No šīs kolekcijas var atlasīt, it kā tā būtu datu bāzes tabula, izsaucot tabulas funkciju SELECT priekšraksta FROM klauzulā. TABLE() operators nav obligāts (? ne vienmēr). Piemēram: SELECT * FROM TABLE (table_function_name (parameter_list)) Vai arī to pašu vaicājumu var rakstīt bez TABLE() operatora: SELECT * FROM table_function_name (parameter_list) Tabulas funkcijas var uztvert rindu kolekciju kā ievadi. Ievades parametrs ir: 1) ligzdtabula vai masīvs; 2) kursora mainīgais (REF CURSOR)). Tāpēc izvadi no tabulas funkcijas TF1 var ievadīt tabulas funkcijā TF2, bet izvadi no TF2 var ievadīt tabulas funkcijā TF3 utt. Lai uzlabotu tabulas funkcijas veiktspēju, var: 1) aktivizējiet funkciju paralēlai izpildei ar opciju PARALLEL_ENABLE; 2) funkcijas, kas iespējotas paralēlai izpildei, var veikt vienlaikus; 3) straumējiet funkcijas rezultātus tieši uz nākamo procesu, izmantojot Oracle straumes; 4) straumēšana novērš starpposmus starp procesiem; 5) realizējiet knveijeru ar PIPELINE opciju.

datubaze.files.wordpress.com  · Web viewAttēlā redzams tipisks datu apstrādes scenārijs, kurā dati tiek izmantoti vairākām (šajā gadījumā trim) transformācijām, kas

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: datubaze.files.wordpress.com  · Web viewAttēlā redzams tipisks datu apstrādes scenārijs, kurā dati tiek izmantoti vairākām (šajā gadījumā trim) transformācijām, kas

1

Tabulas TABLE() datu funkcijaTabulas funkcijas ir lietotāja definētas PL/SQL funkcijas, kas atgriež rindu kolekciju:

1) asociatīvu masīvu;2) ligzdtabulu;3) masīvu (varray)).

No šīs kolekcijas var atlasīt, it kā tā būtu datu bāzes tabula, izsaucot tabulas funkciju SELECT priekšraksta FROM klauzulā. TABLE() operators nav obligāts (? ne vienmēr).Piemēram:SELECT * FROM TABLE (table_function_name (parameter_list))

Vai arī to pašu vaicājumu var rakstīt bez TABLE() operatora:

SELECT * FROM table_function_name (parameter_list)

Tabulas funkcijas var uztvert rindu kolekciju kā ievadi. Ievades parametrs ir:1) ligzdtabula vai masīvs;2) kursora mainīgais (REF CURSOR)).

Tāpēc izvadi no tabulas funkcijas TF1 var ievadīt tabulas funkcijā TF2, bet izvadi no TF2 var ievadīt tabulas funkcijā TF3 utt.

Lai uzlabotu tabulas funkcijas veiktspēju, var:1) aktivizējiet funkciju paralēlai izpildei ar opciju PARALLEL_ENABLE;2) funkcijas, kas iespējotas paralēlai izpildei, var veikt vienlaikus;3) straumējiet funkcijas rezultātus tieši uz nākamo procesu, izmantojot Oracle straumes;4) straumēšana novērš starpposmus starp procesiem;5) realizējiet knveijeru ar PIPELINE opciju.

Tabulas funkcijas tiek izmantotas, lai atgrieztu PL/SQL kolekcijas, kas imitē tabulas. Tās var vaicāt kā parastu tabulu, izmantojot TABLE operatoru FROM klauzulā. Regulārām tabulas funkcijām ir nepieciešams, lai kolekcijas pirms atgriešanas tiktu pilnībā aizpildītas.

Tā kā kolekcijas tiek glabātas atmiņā, tā var būt problēma, jo lielas kolekcijas var tērēt daudz atmiņas un paiet ilgs laiks, līdz tiek atgriezta pirmā rinda. Šīs iespējamās vājās vietas rada regulāras tabulas funkcijas, kas nav piemērotas lielām izvēršanas transformācijas slodzes (ETL) operācijām. Regulārajām tabulas funkcijām ir nepieciešams, lai nosauktie rindu un tabulu tipi tiktu izveidoti kā datu bāzes objekti.

Page 2: datubaze.files.wordpress.com  · Web viewAttēlā redzams tipisks datu apstrādes scenārijs, kurā dati tiek izmantoti vairākām (šajā gadījumā trim) transformācijām, kas

2

Attēlā redzams tipisks datu apstrādes scenārijs, kurā dati tiek izmantoti vairākām (šajā gadījumā trim) transformācijām, kas ieviestas ar tabulas funkcijām, pirms beidzot tiek ielādētas datu bāzē. Šajā scenārijā galda funkcijas netiek paralēlizētas, un pēc katras pārveidošanas jāsadala visa rezultātu kolekcija.

Typical Data Processing with Unparallelized, Unpipelined Table Functions.

Figure shows how streaming and parallel execution can streamline the same scenario.Data Processing Using Pipelining and Parallel Execution.

Page 3: datubaze.files.wordpress.com  · Web viewAttēlā redzams tipisks datu apstrādes scenārijs, kurā dati tiek izmantoti vairākām (šajā gadījumā trim) transformācijām, kas

3

Tabulveida funkcijas izveidošana un izmantošana SELECT vaicājumā-- Datu tipu izveidošana, lai varētu izmantot TABLE() funkciju.create or replace type TIPS_RAKSTS as object ( ID number,APRAKSTS varchar2(50));

create or replace type TIPS_TABULA is table of TIPS_RAKSTS;

-- TABLE funkcijas izveidošanacreate or replace function IZVEIDOT_TABULU (raksti IN number) return TIPS_TABULA as tabula TIPS_TABULA := TIPS_TABULA();begin for i in 1 .. raksti looptabula.extend; tabula(tabula.last) := TIPS_RAKSTS(i, 'Nosaukums ' || i); end loop; return tabula;end;

-- Funkcijas izsaukšana izmantojot funkciju TABLE()select *from TABLE(IZVEIDOT_TABULU(5))order by ID DESC;

-- Funkcijas izsaukšana neizmantojot funkciju TABLE()select *from IZVEIDOT_TABULU(5)order by ID DESC;

Page 4: datubaze.files.wordpress.com  · Web viewAttēlā redzams tipisks datu apstrādes scenārijs, kurā dati tiek izmantoti vairākām (šajā gadījumā trim) transformācijām, kas

4

Table functions return a collection type instance representing rows in a table, and can be queried like a table by calling the function in the FROM clause of a query. Table functions use the TABLE keyword. The following example shows a table function GetBooks that takes a CLOB as input and returns an instance of the collection type BookSet_t. The CLOB column stores a catalog listing of books in some format (either proprietary or following a standard such as XML). The table function returns all the catalogs and their corresponding book listings.

The collection type BookSet_t is defined as: CREATE TYPE Book_t AS OBJECT( name VARCHAR2(100), author VARCHAR2(30), abstract VARCHAR2(1000));

CREATE TYPE BookSet_t AS TABLE OF Book_t;

The CLOBs are stored in a table Catalogs: CREATE TABLE Catalogs( name VARCHAR2(30), cat CLOB);

Function GetBooks is defined as follows: CREATE FUNCTION GetBooks(a CLOB) RETURN BookSet_t;

The query below returns all the catalogs and their corresponding book listings.:

SELECT c.name, Book.name, Book.author, Book.abstract FROM Catalogs c, TABLE(GetBooks(c.cat)) Book;

Page 5: datubaze.files.wordpress.com  · Web viewAttēlā redzams tipisks datu apstrādes scenārijs, kurā dati tiek izmantoti vairākām (šajā gadījumā trim) transformācijām, kas

5

create or replace type STUDENTS_TIPS as object (STUD_NUM number,STUD_UZV varchar2(20),STUD_KURSS number);

create or replace type STUDENTI_TIPS as TABLE of STUDENTS_TIPS;

create table FAKULT_STUD( F_NOS varchar2(20),STUDENTI CLOB);

insert into FAKULT_STUD values('Datorzinātne', '1 Koks 3');

insert into FAKULT_STUD values('Datorzinātne', '2 Zars 3');

select * from FAKULT_STUD;

select STUDENTI from FAKULT_STUD;

Tas laikam ir priekš 18. versijas

create or replace function STUD_SARAKSTS(a CLOB) return STUDENTI_TIPS;

select stud.STUD_NUM, stud.STUD_UZV, stud.STUD_KURSSfrom FAK_STUDENTI c, TABLE(STUD_SARAKSTS(c.STUDENTI)) stud;

Page 6: datubaze.files.wordpress.com  · Web viewAttēlā redzams tipisks datu apstrādes scenārijs, kurā dati tiek izmantoti vairākām (šajā gadījumā trim) transformācijām, kas

6

Tabulu FAKULTATES un STUDENTI izveidošana

create table FAKULTATES (F_NUM number Primary key,F_NOS varchar2(20));

begininsert into FAKULTATES values (1, 'Datorzinības');insert into FAKULTATES values (2, 'Elektronika');end;

create table STUDENTI (S_NUM number Primary key,UZV varchar2(20),KURSS number,NUM_F number);

begininsert into STUDENTI values (1001, 'Koks', 3, 1 );insert into STUDENTI values (1002, 'Koks', 2, 1 );insert into STUDENTI values (1003, 'Koks', 1, 2 );insert into STUDENTI values (1004, 'Koks', 3, 2 );end;

Page 7: datubaze.files.wordpress.com  · Web viewAttēlā redzams tipisks datu apstrādes scenārijs, kurā dati tiek izmantoti vairākām (šajā gadījumā trim) transformācijām, kas

7

Netiešā kursora cikla FOR izmantošana datu pārrakstīšanai no datu bāzes tabulas PL\SQL valodas associatīvajā masīvā (associative array)create or replace package PAKETE_1 astype T_TAB is table of STUDENTI%ROWTYPE – Associatīvā masīva tipa izveidošanaindex by binary_integer;procedure TEST_1;end;

create or replace package body PAKETE_1 asprocedure TEST_1 istabula T_TAB; -- Associatīvā masīva izveidošanabegin-- Tabulas studenti pārrakstīšana associatīvajā masīvāselect * BULK COLLECT INTO tabula from STUDENTI where NUM_F >= 1;DBMS_OUTPUT.PUT_LINE('Cikls caur kolekciju.');-- Netiešā kursora cikla FOR izmantošanafor kurs_raksts in (select * from TABLE(tabula)) loopDBMS_OUTPUT. PUT_LINE(kurs_raksts.S_NUM || ' ' || kurs_raksts.UZV|| ' ' || kurs_raksts.KURSS);end loop kurs_raksts;end;end;

exec PAKETE_1.TEST_1;

Page 8: datubaze.files.wordpress.com  · Web viewAttēlā redzams tipisks datu apstrādes scenārijs, kurā dati tiek izmantoti vairākām (šajā gadījumā trim) transformācijām, kas

8

Netiešā kursora cikla FOR izmantošana datu pārrakstīšanai no datu bāzes tabulas PL\SQL valodas tabulā ar kolelciju (nested table)create or replace package PAKETE_2 astype T_TAB is table of STUDENTI%ROWTYPE;procedure TEST_2;end;

create or replace package body PAKETE_2 asprocedure TEST_2 istabula T_TAB;beginselect * BULK COLLECT into tabula from STUDENTI where NUM_F >= 1;DBMS_OUTPUT.PUT_LINE('Cikls caur kolekciju.');for kurs_raksts in (select * from TABLE(tabula)) loopDBMS_OUTPUT. PUT_LINE(kurs_raksts.S_NUM || ' ' || kurs_raksts.UZV|| ' ' || kurs_raksts.KURSS);end loop kurs_raksts;end;end;

exec PAKETE_2.TEST_2;

Page 9: datubaze.files.wordpress.com  · Web viewAttēlā redzams tipisks datu apstrādes scenārijs, kurā dati tiek izmantoti vairākām (šajā gadījumā trim) transformācijām, kas

9

Netiešā kursora cikla FOR izmantošana datu pārrakstīšanai no datu bāzes tabulas PL\SQL valodas masīvā (varray)

create or replace package PAKETE_2 astype T_TAB is varray(10) of STUDENTI%ROWTYPE;procedure TEST_3;end;

create or replace package body PAKETE_2 asprocedure TEST_3 ismasivs T_TAB;beginselect * BULK COLLECT into masivs from STUDENTI where NUM_F >= 1;DBMS_OUTPUT.PUT_LINE('Cikls caur kolekciju.');for kurs_raksts in (select * from TABLE(masivs)) loopDBMS_OUTPUT. PUT_LINE(kurs_raksts.S_NUM || ' ' || kurs_raksts.UZV|| ' ' || kurs_raksts.KURSS);end loop kurs_raksts;end;end;

exec PAKETE_2.TEST_3;

Page 10: datubaze.files.wordpress.com  · Web viewAttēlā redzams tipisks datu apstrādes scenārijs, kurā dati tiek izmantoti vairākām (šajā gadījumā trim) transformācijām, kas

10

% TYPE un COLUMN_VALUE izmantošana datu bāzes tabulas datu pārrakstīšanā tabulā ar kolekcijutype T_TAB is table of STUDENTI.UZV%TYPE;procedure TEST_4;end;

create or replace package body PAKETE_2 asprocedure TEST_4 istabula T_TAB;beginselect UZV BULK COLLECT into tabula from STUDENTI where NUM_F >= 1;DBMS_OUTPUT.PUT_LINE('Cikls caur kolekciju.');for kurs_raksts in (select * from TABLE(tabula)) loopDBMS_OUTPUT. PUT_LINE(kurs_raksts.COLUMN_VALUE);end loop kurs_raksts;end;end;

exec PAKETE_2.TEST_4;

Page 11: datubaze.files.wordpress.com  · Web viewAttēlā redzams tipisks datu apstrādes scenārijs, kurā dati tiek izmantoti vairākām (šajā gadījumā trim) transformācijām, kas

11

Raksta definējuma izmantošana datu bāzes tabulas datu pārrakstīšanā tabulā ar kolekcijucreate or replace package PAKETE_2 astype T_RAKSTS is record (S_NUM STUDENTI.S_NUM%TYPE,UZV STUDENTI.UZV%TYPE);type T_TABULA is table of T_RAKSTS index by BINARY_INTEGER;tabula T_TABULA;procedure TEST_5;end;

create or replace package body PAKETE_2 asprocedure TEST_5 isbeginselect S_NUM, UZV BULK COLLECT into tabula from STUDENTI where NUM_F >= 1;DBMS_OUTPUT.PUT_LINE('Cikls caur kolekciju.');for kurs_raksts in (select S_NUM, UZV from TABLE(tabula)) loopDBMS_OUTPUT. PUT_LINE(kurs_raksts.S_NUM || ' ' || kurs_raksts.UZV);end loop kurs_raksts;end;end;

exec PAKETE_2.TEST_5;

Page 12: datubaze.files.wordpress.com  · Web viewAttēlā redzams tipisks datu apstrādes scenārijs, kurā dati tiek izmantoti vairākām (šajā gadījumā trim) transformācijām, kas

12

Anonīmā blokā programma uzrāda kļūdasdeclaretype T_RAKSTS is record (S_NUM STUDENTI.S_NUM%TYPE,UZV STUDENTI.UZV%TYPE);type T_TABULA is table of T_RAKSTS index by BINARY_INTEGER;tabula T_TABULA;beginselect S_NUM, UZV BULK COLLECT into tabula from STUDENTI where NUM_F >= 1;DBMS_OUTPUT.PUT_LINE('Cikls caur kolekciju.');for kurs_raksts in (select * from TABLE(tabula)) loopDBMS_OUTPUT. PUT_LINE(kurs_raksts.S_NUM || ' ' || kurs_raksts.UZV);end loop kurs_raksts;end;end;

Error starting at line : 1 in command -declaretype T_RAKSTS is record (S_NUM STUDENTI.S_NUM%TYPE,UZV STUDENTI.UZV%TYPE);type T_TABULA is table of T_RAKSTS index by BINARY_INTEGER;tabula T_TABULA;beginselect S_NUM, UZV BULK COLLECT into tabula from STUDENTI where NUM_F >= 1;DBMS_OUTPUT.PUT_LINE('Cikls caur kolekciju.');for kurs_raksts in (select S_NUM, UZV from TABLE(tabula)) loopDBMS_OUTPUT. PUT_LINE(kurs_raksts.S_NUM || ' ' || kurs_raksts.UZV);end loop kurs_raksts;end;Error report -ORA-06550: line 9, column 50:PLS-00382: expression is of wrong typeORA-06550: line 9, column 44:PL/SQL: ORA-22905: cannot access rows from a non-nested table itemORA-06550: line 9, column 21:PL/SQL: SQL Statement ignoredORA-06550: line 10, column 23:PLS-00364: loop index variable 'KURS_RAKSTS' use is invalidORA-06550: line 10, column 1:PL/SQL: Statement ignored06550. 00000 - "line %s, column %s:\n%s"*Cause: Usually a PL/SQL compilation error.*Action:

Page 13: datubaze.files.wordpress.com  · Web viewAttēlā redzams tipisks datu apstrādes scenārijs, kurā dati tiek izmantoti vairākām (šajā gadījumā trim) transformācijām, kas

13