with priekšraksta ar funkcijām un metodēm testēšana. · web viewwith priekšraksta ar...

23
1 WITH priekšraksta ar funkcijām un metodēm testēšana. Vienkāršas testa tabulas veidošana Ja nepieciešam ģenerēt vesalu skaitļu rindu vai izveidot vienkāršu vienas kolonas tabulu, var izmantot hierarhisko vaicājumu CONNECT BY klauzulu. Hierarhiskos vaicājumos, ja izlaižot PRIOR (iepriekšējais) atslēgvārdu, rinda tiek savienota ar katru augstāka līmeņa rindu. Nav ierobežojumu bērnu rindu pievienošanai vecāku rindām. Un, ja tiek izlaista arī START WITH klauzula, tas nozīmē, ka visi raksti ir 1. līmenī. Ar vienas rindas tabulu tas nozīmē sekojošo. Pirmais raksts ir saknes līmenī (1. līmenis), jo nav START WITH klauzula. Un katrā atkārtojumā hierarhiskais koks kļūst dziļāks (un līmeņa pseido kolona LEVEL palielinās), jo visi tabulas raksti tiek savienoti ar visiem iepriekšējā līmeņa rakstiem. Rekursīvās hierarhijas izveide tiek pārtraukta, kad nosacījums vairs neizpildās, un vaicājums iziet no rekursīvās cilpas. Veiksim divu vesalo skaiļu virkņu ģenerēšanu, izmantojot SELECT vaicājumu ar DUAL tabulu un hierarhijas norādi CONNECT BY. Vienā variantā izmantosim pseidokolonu LEVEL otrā tabulas rindas numuru ROWNUM (attēlā). select LEVEL as Virkne from DUAL connect by LEVEL <= 3; select ROWNUM as Virkne from DUAL connect by ROWNUM <= 3;

Upload: others

Post on 23-Sep-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: WITH priekšraksta ar funkcijām un metodēm testēšana. · Web viewWITH priekšraksta ar funkcijām un metodēm testēšana. Vienkāršas testa tabulas veidošana. Ja nepieciešam

1

WITH priekšraksta ar funkcijām un metodēm testēšana.Vienkāršas testa tabulas veidošana

Ja nepieciešam ģenerēt vesalu skaitļu rindu vai izveidot vienkāršu vienas kolonas tabulu, var izmantot hierarhisko vaicājumu CONNECT BY klauzulu. Hierarhiskos vaicājumos, ja izlaižot PRIOR (iepriekšējais) atslēgvārdu, rinda tiek savienota ar katru augstāka līmeņa rindu. Nav ierobežojumu bērnu rindu pievienošanai vecāku rindām. Un, ja tiek izlaista arī START WITH klauzula, tas nozīmē, ka visi raksti ir 1. līmenī. Ar vienas rindas tabulu tas nozīmē sekojošo.Pirmais raksts ir saknes līmenī (1. līmenis), jo nav START WITH klauzula. Un katrā atkārtojumā hierarhiskais koks kļūst dziļāks (un līmeņa pseido kolona LEVEL palielinās), jo visi tabulas raksti tiek savienoti ar visiem iepriekšējā līmeņa rakstiem. Rekursīvās hierarhijas izveide tiek pārtraukta, kad nosacījums vairs neizpildās, un vaicājums iziet no rekursīvās cilpas.Veiksim divu vesalo skaiļu virkņu ģenerēšanu, izmantojot SELECT vaicājumu ar DUAL tabulu un hierarhijas norādi CONNECT BY. Vienā variantā izmantosim pseidokolonu LEVEL otrā tabulas rindas numuru ROWNUM (attēlā).

select LEVEL as Virknefrom DUAL connect by LEVEL <= 3;

select ROWNUM as Virknefrom DUAL connect by ROWNUM <= 3;

Turpmākajos testa piemēros būs nepieciešama tabula ar lielu rakstu skaitu. Noģenerēsim tabulu TA ar 1 000 000 rindām. Ja gadījumā tabula TA eksistētu, veiksim tās nodzēšanu, gan datus, gan struktūru. Veiksim 4 rindu izvadi (attēls).drop table TA PURGE;create table TA asselect 1 as IDfrom DUALconnect by LEVEL <= 1000000;

select ROWNUM, ID from TAwhere ROWNUM <=4;Atslēgvārds PURGE tabulas dzēšanas DROP komandā tiek iekļauts, ja jānodzēš tabula un jāatbrīvo ar to saistītā atmiņa ar vienu komandu. Ja norādīts atslēgvārds PURGE , tad

Page 2: WITH priekšraksta ar funkcijām un metodēm testēšana. · Web viewWITH priekšraksta ar funkcijām un metodēm testēšana. Vienkāršas testa tabulas veidošana. Ja nepieciešam

2

datu bāzes sistēma neievieto atkritnē (recycle bin) tabulu un tās atkarīgos objektus. Tabulu nevar vēlāk atjaunot (roll back). Vaicājuma izpildes laika noteikšana

Lai noteiktu vāicājuma izpildes laiku izmanto divas programmu paketes DBMS_UTILITY funkcijas:

1) DBMS_UTILITY.GET_TIME funkciju;2) DBMS_UTILITY.GET_CPUTIME funkciju.

GET_TIME funkcija nosaka pašreizējo laiku sekundes simtdaļās (1/100 hsecs). Šī funkcija galvenokārt tiek izmantota, lai noteiktu pagājušo laiku. Tā tiek izsaukta divreiz – kāda procesa sākumā un beigās. Un tad pirmā (agrākā) vērtība tiek atņemta no otrās (vēlākās) vērtības, lai noteiktu laiku, kas pagājis. Skaitļi tiek atgriezti diapazonā no -2147483648 līdz 2147483647 atkarībā no platformas un datora. Nosakot intervālu, ir jāņem vērā vērtības zīme.

GET_CPU_TIME funkcija atgriež pašreizējo centrālā procesora laiku sekundes simtdaļās (1/100 hsecs). Atgrieztais centrālā procesora laiks ir sekundes simtdaļu skaitlis no kāda patvaļīga atskaites punkta.

Page 3: WITH priekšraksta ar funkcijām un metodēm testēšana. · Web viewWITH priekšraksta ar funkcijām un metodēm testēšana. Vienkāršas testa tabulas veidošana. Ja nepieciešam

3

WITH priekšrakstā iekļautas funkcijas ātrdarbības tests

Lai veiktu WITH priekšrakstā iekļautas funkcijas ātrdarbības testu, salīdzināsim to ar parastu funkciju, kuras izsaukums iekļauts SELECT vaicājumā. Definēsim parastu funkciju PARASTA_FUNKCIJA.

create or replace function PARASTA_FUNKCIJA(p_id IN number) return number isbegin return p_id;end;

Izveidosim PL/SQL anonīmo bloku, kurā ar kursora mainīgo izpildīsim WITH tipa vaicājumus ar WITH_FUNKCIJU un SELECT vaicājumus ar PARASTA_FUNKCIJA izsaukumiem. Izmantojot programmu paketes DBMS_UTILITY funkcijas Get_time un Get_cpu_time novērtēsim abu vaicājumu izpildes ātrdarbību. Iegūtie rezultāti redzami attēlā. WITH priekšraksta izmantošana ievērojami uzlabojusi vaicājuma izpildes ātrdarbību salīdzinot ar SELECT vaicājumu (attēls).

declare laiks pls_integer; cpu pls_integer; sql_kom varchar2(500); kursors SYS_REFCURSOR; type TIPS_TABULA is table of number; tabula TIPS_TABULA;begin-- WITH priekšraksta izmantošana funkcijas izpildei. laiks := DBMS_UTILITY.Get_time; cpu := DBMS_UTILITY.Get_cpu_time; sql_kom := 'WITH function WITH_FUNKCIJA(p_id IN number) return number is begin return p_id; end; select WITH_FUNKCIJA(id) from TA'; OPEN kursors FOR sql_kom; FETCH kursors BULK COLLECT INTO tabula; CLOSE kursors; DBMS_OUTPUT.put_line('WITH_FUNCTION : ' || 'Laiks =' || TO_CHAR(DBMS_UTILITY.get_time - laiks) || ' hsecs ' ||

Page 4: WITH priekšraksta ar funkcijām un metodēm testēšana. · Web viewWITH priekšraksta ar funkcijām un metodēm testēšana. Vienkāršas testa tabulas veidošana. Ja nepieciešam

4

'CPU laiks=' || (DBMS_UTILITY.get_cpu_time - cpu) || ' hsecs ');-- SELECT priekšraksta izmantošana funkcijas izpildei. laiks := DBMS_UTILITY.Get_time; cpu := DBMS_UTILITY.Get_cpu_time;

sql_kom := 'select PARASTA_FUNKCIJA(id) from TA'; OPEN kursors FOR sql_kom; FETCH kursors BULK COLLECT INTO tabula; CLOSE kursors; DBMS_OUTPUT.put_line('Parasta funkcija: ' || 'Laiks=' || TO_CHAR(DBMS_UTILITY.get_time - laiks) || ' hsecs ' || 'CPU laiks=' || (DBMS_UTILITY.get_cpu_time - cpu) || ' hsecs '); end;

Page 5: WITH priekšraksta ar funkcijām un metodēm testēšana. · Web viewWITH priekšraksta ar funkcijām un metodēm testēšana. Vienkāršas testa tabulas veidošana. Ja nepieciešam

5

Ātrdarbības tests WITH iekļautās funkcijas un parastas funkcijas un izpildes salīdzināšanai (atkārtojums).1. WITH iekļautās funkcijas ātrdarbības noteikšana

Izveidojam PL/SQL anonīmo bloku, kurā simbolu tipa mainīgajā sql_vaic ierakstām WITH priekšrakstu ar iekļautās funkcijas (inline function) izmantošanu. Turpinājumā ar kursora palīdzību WITH vaicājumā iegūtie rezultāti tiek parrakstīti PL/SQL ligzdtabulā tabula.Testa programma nosaka vaicājuma izpildes laiku un centrālā procesora (CPU) lietojumu. Tas tiek realizēts izmantojot divas DBMS_UTILITY programmu paketes funkcijas GET_TIME un GET_CPU_TIME. Programma nosaka šo funkciju vērtības programmas izpildes sākumā un beigās. Starpības ir izpildes laiki (attēlā).

set SERVEROUTPUT ON;declare laiks PLS_INTEGER; cpu_laiks PLS_INTEGER; sql_vaic varchar2(500); kursors SYS_REFCURSOR; type TIPS_TABULA is table of number; tabula TIPS_TABULA;begin laiks := DBMS_UTILITY.get_time; -- Sākuma laika fiksēšana. cpu_laiks := DBMS_UTILITY.get_cpu_time; -- Procesora sākuma laika fiksēšana. sql_vaic := 'WITH function WITH_FUNKCIJA(n IN number) return number is begin return n; end; select WITH_FUNKCIJA(ID) from TA'; open kursors for sql_vaic; fetch kursors BULK COLLECT into tabula; close kursors; DBMS_OUTPUT.put_line('WITH_FUNKCIJA : ' || 'Izpildes laiks = ' || TO_CHAR(DBMS_UTILITY.Get_time - laiks) || ' hsecs ' || 'CPU laiks=' || (DBMS_UTILITY.Get_cpu_time - cpu_laiks) || ' hsecs ');end;

Page 6: WITH priekšraksta ar funkcijām un metodēm testēšana. · Web viewWITH priekšraksta ar funkcijām un metodēm testēšana. Vienkāršas testa tabulas veidošana. Ja nepieciešam

6

Ātrdarbības tests WITH iekļautās funkcijas un parastas funkcijas un izpildes salīdzināšanai (atkārtojums).2. Parastas funkcijas ātrdarbības noteikšana

Definēsim parastu funkciju, tādu pašu, kā iekļāvām WITH priekšrakstā:

create or replace function PARASTA_FUNKCIJA(n IN number) return number isbegin return n;end;

Izveidosim PL/SQL anonīmo bloku parastas funkcijas ātrdarbības noteikšanai. Tā struktūra ir tāda pati kā WITH funkcijas gadījumā. Atšķirība ir tā, ka funkcija netiek lietota WITH priekšrakstā, bet parastā SELECT vaicājumā.Izpildām anonīmo bloku un iegūstam pārbaudes rezultātus (attēlā). Tie parāda, ka funkcijas izmantošana WITH priekšrakstā ir devusi ievērojamu ātrdarbības uzlabojumus. Arī dažādos rakstos ir minēts, ka uzlabojums ir apmēram 3 reizes.

declare laiks PLS_INTEGER; cpu_laiks PLS_INTEGER; sql_vaic varchar2(32767); kursors SYS_REFCURSOR; type T_TABULA is table of number; tabula T_TABULA;begin laiks := DBMS_UTILITY.get_time; -- Sākuma laika fiksēšana. cpu_laiks := DBMS_UTILITY.get_cpu_time; -- Procesora sākuma laika fiksēšana. sql_vaic := 'select PARASTA_FUNKCIJA(ID) from TA'; open kursors for sql_vaic; fetch kursors BULK COLLECT into tabula; close kursors; DBMS_OUTPUT.put_line('PARASTA_FUNKCIJA : ' || 'Izpildes laiks = ' || TO_CHAR(DBMS_UTILITY.get_time - laiks) || ' hsecs ' || 'CPU laiks=' || (DBMS_UTILITY.get_cpu_time - cpu_laiks) || ' hsecs ');end;

Page 7: WITH priekšraksta ar funkcijām un metodēm testēšana. · Web viewWITH priekšraksta ar funkcijām un metodēm testēšana. Vienkāršas testa tabulas veidošana. Ja nepieciešam

7

Norādes PRAGMA UDF (user defined function) pielietojums1 2

Pragma – norāde. Teikums programmēšanas valodā, kas kompilatoram var palīdzēt programmas translēšanā.

UDF pragma (norāde) kompilatoram norāda, ka PL/SQL vienība ir lietotāja definēta funkcija, kas tiek izmantota galvenokārt SQL priekšrakstos, kas var uzlabot to veiktspēju.Bieži ir noderīgi izpildīt PL/SQL funkcijas kā SQL priekšraksta (vai cita DML) daļu. Kad SQL izsauc PL/SQL, notiek “konteksta pārslēgšana”, jo izpilde pārvietojas starp SQL izpildi un PL/SQL izpildi. Oracle Database 12c Oracle ir devis mums divus rīkus, kas palīdz mazināt šīs kontekstuālās pārslēgšanas ietekmi.

1. Pirmā ir iespēja pievienot lokālās funkcijas definīciju SELECT, izmantojot klauzulu WITH.

2. Otrā ir iespēja atzīmēt funkciju, izmantojot PRAGMA UDF, lai kompilators un optimizētājs zinātu, ka tā būs jāizmanto no SQL.

Abas opcijas var būtiski uzlabot veiktspēju, ja tiek izmantotas pareizi.Lai panāktu maksimālu veiktspējas pieaugumu:

1) attiecīgā PL/SQL funkcija nedrīkst izsaukt citas PL/SQL procedūras un/vai PL/SQL funkcijas;

2) PRAGMA UDF funkcijas nedrīkst izsaukt no “parastā” PL/SQL (nevis SQL).

Lai izmantotu PRAGMA UDF, PARASTAS_FUNKCIJAS kods jāpārdefinē:

create or replace function PARASTA_FUNKCIJA(n IN number) return number isPRAGMA UDF;begin return n;end;

Palaižot testa programmu tiek iegūti sekojoši rezultāti:

Redzam, ka PRAGMA UDF norādes izmantošana būtiski ir izmainījusi izpildes ātrdarbību. Tā uzlbojusies vismaz 2 reizes.

1https://mwidlake.wordpress.com/2015/11/04/pragma-udf-speeding-up-your-plsql-functions-called-from-sql/2 http://www.oaktable.net/content/oracle-12c-%E2%80%93-plsql-select-pragma-udf

Page 8: WITH priekšraksta ar funkcijām un metodēm testēšana. · Web viewWITH priekšraksta ar funkcijām un metodēm testēšana. Vienkāršas testa tabulas veidošana. Ja nepieciešam

8

WITH_PLSQL ieteikums (hint)

Ja vaicājums, kas satur PL/SQL deklarācijas sadaļu, nav augstākā līmeņa vaicājums, augšējā līmeņa vaicājumā jāiekļauj WITH_PLSQL atgādinājums jeb ieteikums (hint). Bez šī norādījuma priekšrakstu neizdosies kompilēt, kā parādīts šajā atjaunināšanas komandā.

UPDATE TA aSET a.id = (WITHFUNCTION with_function(p_id IN NUMBER) RETURN NUMBER ISBEGINRETURN p_id;END;SELECT with_function(a.id)FROM dual);

SET a.id = (WITH *ERROR at line 2:ORA-32034: unsupported use of WITH clause

Pievienojot WITH_PLSQL operatoru, SQL priekšraksts tiks kompilēts un izpildīts.

UPDATE /*+ WITH_PLSQL */ TA aSET a.id = (WITH FUNCTION with_function(p_id IN NUMBER) RETURN NUMBER IS BEGIN RETURN p_id; END; SELECT with_function(a.id) FROM dual);

Page 9: WITH priekšraksta ar funkcijām un metodēm testēšana. · Web viewWITH priekšraksta ar funkcijām un metodēm testēšana. Vienkāršas testa tabulas veidošana. Ja nepieciešam

9

DETERMINISTIC ieteikums (hint)

Funkciju klauzula DETERMINISTIC ir piemērota funkcijām, kurām nav nenoteiktības komponentu. Tas nozīmē, ka katru reizi, kad norādāt funkciju ar vienādām parametru vērtībām, rezultāts ir vienāds. Definējot funkciju, deklarācijas sekcijai var vienkārši pievienot DETERMINISTIC opciju, nodrošinot, ka funkcija vai procedūra nav atkarīga no sesijas mainīgo vai shēmas objektu stāvokļa, jo rezultāti var atšķirties starp izsaukumiem. Šī opcija norāda optimizētājam, ka tas var izmantot kešoto rezultātu, ja ir iepriekš aprēķināts rezultāts.

Funkcijas norādīšanas kā DETERMINISTISKA dot ātrdarbības pieaugumu, ja viena un tā pati funkcija tiek izpildīta daudzreiz ar tām pašām parametru vērtībām tajā pašā SQL priekšrakstā. Uz funkcijām balstīti indeksi var izmantot tikai funkcijas, kas atzīmētas kā DETERMINISTIC. Viens ierobežojums ir tāds, ka ligzdotu (iekļautu) funkciju nevar definēt kā DETERMINISTIC.

Ja funkcijai nav blakņu un tā ir noteikta, ir ieteicams pievienot DETERMINISTIK opciju. Tas, vai optimizētājs izmanto šo informāciju, ir tikai tā ziņā. Citi kodētāji zinās, ka tiek plānot izveidot noteiktu funkciju bez blakusefektiem, pat ja optimizētājs neredz šīs informācijas izmantošanu.

Izveidojam WITH priekšrakstu ar funkciju FUNKCIJA un galveno SELECT vaicājumu. Norādīsim, ka funkcijas tips ir DETERMINISTIC. Iegūsim izpildes rezultātu (attēls).

SET TIMING ON ARRAYSIZE 15WITH FUNCTION FUNKCIJA(p_id IN NUMBER) RETURN NUMBER DETERMINISTIC IS BEGIN DBMS_LOCK.sleep(1); RETURN p_id; END;SELECT FUNKCIJA(id)FROM TAWHERE ROWNUM <= 10;

Page 10: WITH priekšraksta ar funkcijām un metodēm testēšana. · Web viewWITH priekšraksta ar funkcijām un metodēm testēšana. Vienkāršas testa tabulas veidošana. Ja nepieciešam

10

Vēlreiz ipildīsim vaicājumu, bet neiekļausim funkcijas definējumā DETERMINISTIK. Izpildīsim vaicājumu un iegūsim rezultātu (attēls).Salīdzinot rezultātus redzam, ka norādes DETERMINISTIKiekļausšana funkcijas definējumā apmēram 10 reizes ir palielinājusi vaicājuma izpildes ātrumu.

Page 11: WITH priekšraksta ar funkcijām un metodēm testēšana. · Web viewWITH priekšraksta ar funkcijām un metodēm testēšana. Vienkāršas testa tabulas veidošana. Ja nepieciešam

11

Skalāra apakšvaicājuma kešdarbe3

Skalārā apakšvaicājuma kešdarbe (Scalar Subquery Caching) ir vienīgais mehānisms, kas efektīvi samazina konteksta slēdžu skaitu starp SQL un PL/SQL. Lai to parādītu, mēs izveidosim jaunu testa tabulu TA ar 1000 000 vienas vērtības rindām.

drop table TA;create table (ID number);insert /*+ APPEND */ into TAselect 1from DUALconnect by LEVEL <= 1000000;COMMIT;

APPEND ieteikums (hint) liek optimizētājam veikt tiešā-ceļa (direct-path) datu ievietošanu, kas uzlabo INSERT ... SELECT priekšraksta veiktspēju. Tam ir vairāki iemesli:1) dati tiek pievienoti tabulas beigās, nevis mēģinot izmantot tabulā esošo brīvo vietu;2) dati tiek rakstīti tieši datu failos, paejot garām bufera kešatmiņai;3) atsauces integritātes ierobežojumi netiek ņemti vērā; *4) netiek atļauta trigeru darbība. *Šo noteikumu kombinācija padara tiešā ceļa ieliktņus ievērojami ātrākus nekā parastā ceļa ieliktņus.* Šie divi punkti var ietekmētt datu loģisko integritāti. Datu bāzes sistēma ignorē APPEND ieteikumu un dati tiek ielādēti, izmantojot parasto ielādes ceļu, ja tabulā ir iespējoti atsauces integritātes ierobežojumi un iespējoti trigeri. APPEND var izmantot, ja ir atspējoti atsauces integritātes ierobežojumi un tabulas trigeri.

Definējam funkciju FUNKCIJA, kuru izmantosim testa vaicājumos.

create or replace function FUNKCIJA (p_in IN number) return number RESULT_CACHE asbegin --DBMS_LOCK.sleep(1); return p_in;end;

3 https://oracle-base.com/articles/misc/efficient-function-calls-from-sql#scalar-subquery-caching-revisited

Page 12: WITH priekšraksta ar funkcijām un metodēm testēšana. · Web viewWITH priekšraksta ar funkcijām un metodēm testēšana. Vienkāršas testa tabulas veidošana. Ja nepieciešam

12

Skalārs apakšvaicājums SELECT klauzulā

Izveidojam PL/SQL anonīmo bloku, kurā realizējam divus ciklus. Pirmajā ciklā tiek izpildīti pamatvaicājumi (vienlīmeņa SELECT priekšraksti) ar funkcijas FUNKCIJA izsaukšanu, otrajā ciklā skalārs apakšvaicājums ar funkcijas FUNKCIJA izsaukšanu. Izmantojot programmu paketes DBMS_UTILITY funkciju Get_CPU_time, tiek noteikti ciklu izpildes laiki. Rezultāti parādīti attēlā. Redzam ka skalārā apakšvaicājuma kešdarbes izmantošana dod ievērojamu izpildes laika saīsināšanu.

SET SERVEROUTPUT ON

DECLARE sakums number;BEGIN sakums := DBMS_UTILITY.Get_CPU_time; for raksts in (SELECT FUNKCIJA(id) FROM TA) LOOP NULL;end LOOP;DBMS_OUTPUT.put_line('Pamatvaicājums: ' || (DBMS_UTILITY.get_cpu_time - sakums) || ' hsecs CPU laiks');

sakums := DBMS_UTILITY.Get_CPU_time; for raksts in (select(select FUNKCIJA(id) from DUAL) from TA) LOOP NULL;end LOOP; DBMS_OUTPUT.put_line('Skalārs apakšvaicājums: ' || (DBMS_UTILITY.get_cpu_time - sakums) || ' hsecs CPU laiks');END;

Testa rezultāti parāda, ka funkcijas iekļaušana pakārtotā vaicājumā būtiski uzlabo ātrdarbību.

Page 13: WITH priekšraksta ar funkcijām un metodēm testēšana. · Web viewWITH priekšraksta ar funkcijām un metodēm testēšana. Vienkāršas testa tabulas veidošana. Ja nepieciešam

13

Skalārs apakšvaicājums WHERE klauzulā

Skalārs apakšvaicājums var būt WHERE klauzulā. Arī šajā gadījumā ātrdarbība ir labāka.

DECLARE sakums number;BEGIN sakums := DBMS_UTILITY.get_cpu_time; FOR raksts IN (SELECT 1 FROM TA WHERE id = FUNKCIJA(id)) LOOP NULL; END LOOP; DBMS_OUTPUT.put_line('Pamatvaicājums (funkcija WHERE klauzulā): ' || (DBMS_UTILITY.get_cpu_time - sakums) || ' hsecs CPU laiks');

sakums := DBMS_UTILITY.get_cpu_time; FOR raksts IN (SELECT 1 FROM TA WHERE id = (SELECT FUNKCIJA(id) FROM dual)) LOOP NULL; END LOOP; DBMS_OUTPUT.put_line('Skalārs apakšvaicājums (funkcija WHERE klauzulā): ' || (DBMS_UTILITY.get_cpu_time - sakums) || ' hsecs CPU laiks');END;

Page 14: WITH priekšraksta ar funkcijām un metodēm testēšana. · Web viewWITH priekšraksta ar funkcijām un metodēm testēšana. Vienkāršas testa tabulas veidošana. Ja nepieciešam

14

WITH Clause Enhancements in Oracle Database 12c Release 1 (12.1)4 5

In addition to the Subquery Factoring Clause, Oracle 12c includes a PL/SQL declaration section in the WITH clause.

SetupFunctions in the WITH ClauseProcedures in the WITH ClausePL/SQL SupportPerformance AdvantagesPRAGMA UDFWITH_PLSQL HintDETERMINISTIC HintScalar Subquery Caching

Related articles.WITH Clause : PL/SQL Declaration Section WITH Clause : Subquery FactoringRecursive Subquery Factoring : Hierarchical Queries Using Recursive WITH ClausesEfficient Function Calls From SQL

4 https://oracle-base.com/articles/12c/with-clause-enhancements-12cr1#setup5 file:///F:/__PLSQL/16_PLSQL_valoda_SQL_vaicajumos/Doing_PLSQL_from_SQL_Ora_2019.pdf

Page 15: WITH priekšraksta ar funkcijām un metodēm testēšana. · Web viewWITH priekšraksta ar funkcijām un metodēm testēšana. Vienkāršas testa tabulas veidošana. Ja nepieciešam

15