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. !!!