Tag Archives: pipelined

Funcions pipelined

Es poden crear funcions que simulen taules, i que a diferencia de les table functions on calia preomplir tots els resultats abans, aquí en els pipelined, es pot anar omplint al vol.

Com a exemple, una funció que ens torna les taules de multiplicar, no es gaire bon exemple, pero es senzil…

Un millor exemple seria per temes de BI, un que ens generes dates, o simplement nombres.

Cal crear dos tipus d’objecte, un que es de camps, com per exemple columnes, o com alguns diuen un record.

L’altre es un “array” de l’anterior, o com en diuen alguns una collection.

–DROP TYPE BI_INT.TY_RMULT;

CREATE OR REPLACE TYPE TY_RMult
AS OBJECT
(
A INT,
B INT,
R INT
)
/

–DROP TYPE BI_INT.TY_TMult;

CREATE OR REPLACE TYPE TY_TMult
AS TABLE OF TY_RMult
/

Aquests dos tipus no es poden crear dintre de una package, sino que son generals, son a nivell de base de dades o esquema. (igual que una package)

Creem la package:

CREATE OR REPLACE PACKAGE JMS_TEST
AS
FUNCTION fTMult (pTau PLS_INTEGER) RETURN TY_TMult PIPELINED;
END JMS_TEST;
/

Creem el body…

CREATE OR REPLACE PACKAGE BODY JMS_TEST
AS
FUNCTION fTMult (pTau PLS_INTEGER) RETURN TY_TMult PIPELINED IS
BEGIN
DBMS_OUTPUT.ENABLE;
FOR i in 1 .. pTau LOOP
FOR j in 1 .. 10 LOOP
PIPE ROW (TY_RMult(i,j,i*j));
END LOOP;
if mod(i,100) =0 then
dbms_output.put_line(i);
end if;
END LOOP;
RETURN;
END fTMult;

END JMS_TEST;
/

Ara quan executem :

select * from TABLE (JMS_TEST.fTMult(300));

Ens surten les taules de multiplicar…

A B R
1
1
1
1
2
2
1
3
3
1
4
4
1
5
5
1
6
6
1
7
7
1
8
8

 

A mida que anem consultant, s’executen els bucles i al passar per 100, 200 i 300 hi ha un put line a dbms_output.

Així veiem que realment es una funció pipelined. !!!