Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/03/2008, 12h29   #1
Membre Expert
 
Avatar de fatsora
 
Inscription : février 2006
Messages : 1 105
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 1 105
Points : 1 214
Points : 1 214
Par défaut faire un loop dans une fonction pipelined

Bonjour a tous , j'ai créé une fonction
qui marche mais
quand je veux faire un loop j'ai du mal

comment je pourrais faire

c'est comme un BULK dans un BULK
ca marche pour un element, mais si je veux toutes les valeurs
d'une table j'ai une erreur
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
 
CREATE a pipelined FUNCTION
CREATE OR REPLACE FUNCTION F_DAILY_BAR
(
V_ticker IN VARCHAR2 )
RETURN EVENT_table_type PIPELINED
IS
BEGIN
DECLARE
v_max_tick data_event.id_stock%type;
v_max_price data_event.price%type;
v_max_vol data_event.volume%type;
v_max_time data_event.server_time%type;
v_min_price data_event.price%type;
v_min_tick data_event.id_stock%type;
v_min_time data_event.server_time%type;
v_volume data_event.volume%type;
v_close data_event.volume%type;
l_limit NUMBER := 1000;
type typ_tab_data
IS
TABLE OF barre_minute%ROWTYPE;
v_incoming typ_tab_data;
v_outgoing EVENT_ROW_TYPE;
l_done BOOLEAN;
CURSOR c2_cur
IS
SELECT id_stock,
dt ,
high ,
low ,
OPEN ,
CLOSE ,
volume ,
trade
FROM
( WITH dates AS
(SELECT (TRUNC(sysdate) + 8/24)+(LEVEL -1) /(24*60) dt
FROM DUAL CONNECT BY LEVEL <= 800
)
SELECT LAST_VALUE(id_stock IGNORE NULLS)OVER (PARTITION BY id_stock) id_stock ,
dt ,
CASE
WHEN trade IS NULL
THEN LAST_VALUE(CLOSE IGNORE NULLS) OVER (PARTITION BY id_stock ORDER BY DT)
ELSE low
END low ,
CASE
WHEN trade IS NULL
THEN LAST_VALUE(CLOSE IGNORE NULLS) OVER (PARTITION BY id_stock ORDER BY DT)
ELSE high
END high ,
CASE
WHEN trade IS NULL
THEN LAST_VALUE(CLOSE IGNORE NULLS) OVER (PARTITION BY id_stock ORDER BY DT)
ELSE OPEN
END OPEN ,
LAST_VALUE(CLOSE IGNORE NULLS) OVER (PARTITION BY id_stock ORDER BY DT) CLOSE ,
LAST_VALUE(volume IGNORE NULLS) OVER (PARTITION BY id_stock ORDER BY DT) volume ,
NVL(trade,0) trade
FROM dates
LEFT JOIN vw_barre_min m PARTITION BY (id_stock)
ON dates.dt = m.server_time
ORDER BY dt
)
WHERE id_stock=v_ticker;
BEGIN
 
SELECT id_stock,
price ,
TIME ,
volume
INTO v_max_tick ,
v_max_price ,
v_max_time ,
v_max_vol
FROM UTIL_HISTO_EVENT
WHERE id_stock=V_ticker;
SELECT TIME ,
id_stock,
price
INTO v_min_time,
v_min_tick,
v_min_price
FROM
(SELECT TRUNC(server_time, 'hh24') + (TRUNC(TO_CHAR(server_time,'mi')))/24/60 TIME,
id_stock ,
price ,
volume ,
rank() over (partition BY id_stock ORDER BY TRUNC(server_time, 'hh24') + (TRUNC(TO_CHAR(server_time,'mi')))/24/60 ASC ,price ASC, volume ASC ) rank
FROM mv_barre_event
GROUP BY id_stock,
price ,
volume ,
TRUNC(server_time, 'hh24') + (TRUNC(TO_CHAR(server_time,'mi')))/24/60
ORDER BY TRUNC(server_time, 'hh24') + (TRUNC(TO_CHAR(server_time,'mi')))/24/60 ASC
)
WHERE rank =1
AND id_stock=v_ticker;
OPEN c2_cur;
LOOP
FETCH c2_cur bulk collect
INTO v_incoming LIMIT l_limit;
 
l_done:= c2_cur%NOTFOUND;
FOR i IN 1..v_incoming.couNT
LOOP
IF (v_incoming(i).open IS NULL AND v_max_tick=v_incoming(i).id_stock AND v_incoming(i).id_stock=v_ticker) THEN
v_incoming(i).open := v_max_price;
v_incoming(i).close := v_max_price;
v_incoming(i).low := v_max_price;
v_incoming(i).high := v_max_price;
v_incoming(i).volume:=v_max_vol;
END IF;
IF (v_incoming(i).server_time=v_min_time AND v_incoming(i).id_stock=v_ticker) THEN
v_incoming(i).open := v_min_price;
END IF;
v_outgoing :=event_row_type(v_incoming(i).id_stock, v_incoming(i).server_time, v_incoming(i).open, v_incoming(i).low, v_incoming(i).close, v_incoming(i).high, v_incoming(i).volume, v_incoming(i).trade );
-- pipe row(event_row_type(r.id_stock,r.dt,r.open,r.low,r.high,r.close,r.volume,r.trade));
pipe row (v_outgoing);
END LOOP;
RETURN ;
END LOOP;
CLOSE c2_cur;
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL;
END;
END F_DAILY_BAR;
/

voici la procedure


Code :
1
2
3
4
5
6
7
8
9
10
11
12
CREATE OR REPLACE procedure P_LIST_DAILY_BARRE_M
AS
v_ticker data_event.id_stock%type;
begin
FOR x IN ( SELECT id_stock FROM ticker_tmp )
loop
-- dbms_output.put_line(x.id_stock);
DBMS_APPLICATION_INFO.SET_module( 'IN LOOP : '||x.id_stock,'');
execute immediate 'select * from table(F_DAILY_BAR(x.id_stock))';
end loop;
end;
/
Code :
1
2
3
4
5
6
7
8
9
10
 
 
SQL> exec p_list_daily_barre_m;
BEGIN p_list_daily_barre_m; END;
 
*
ERROR at line 1:
ORA-06553: PLS-306: wrong number OR types of arguments IN call TO 'OGC_X'
ORA-06512: at "P_LIST_DAILY_BARRE_M", line 9
ORA-06512: at line 1
Merci d'avance
fatsora est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2008, 14h34   #2
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
il sert à quoi le EXECUTE IMMEDIATE ?

au pire tu peux faire :
Code :
execute immediate 'select * from table(F_DAILY_BAR(:1))' USING x.id_stock;
Sinon :
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2008, 15h22   #3
Membre Expert
 
Avatar de fatsora
 
Inscription : février 2006
Messages : 1 105
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 1 105
Points : 1 214
Points : 1 214
Par défaut iteration

Citation:
Envoyé par orafrance Voir le message
il sert à quoi le EXECUTE IMMEDIATE ?

au pire tu peux faire :
Code :
execute immediate 'select * from table(F_DAILY_BAR(:1))' USING x.id_stock;
Sinon :
Merci pour la reponse rapide

en fait

je veux faire

select * from table(f_daily_bar('element1')));
puis
select * from table(f_daily_bar('element2'));
puis
...

a la fin

afficher le resultat
fatsora est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2008, 15h37   #4
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
et :

Code :
1
2
SELECT TABLE(F_DAILY_BAR(id_stock)) 
FROM ticker_tmp
c'est pas plus simple qu'une procédure stockée ?
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2008, 16h42   #5
Membre Expert
 
Avatar de fatsora
 
Inscription : février 2006
Messages : 1 105
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 1 105
Points : 1 214
Points : 1 214
Par défaut iteration

je cherche justement le plus simple

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Elapsed: 00:00:00.00
SQL> SELECT * FROM TABLE(f_daily_bar(id_stock)) WHERE id_stock IN SELECT id_stock FROM ticker_tmp;
SELECT * FROM TABLE(f_daily_bar(id_stock)) WHERE id_stock IN SELECT id_stock FROM ticker_tmp
                                                             *
ERROR at line 1:
ORA-00936: missing expression
 
 
Elapsed: 00:00:00.01
SQL> SELECT * FROM TABLE(f_daily_bar(id_stock)) WHERE id_stock IN (SELECT id_stock FROM ticker_tmp);
SELECT * FROM TABLE(f_daily_bar(id_stock)) WHERE id_stock IN (SELECT id_stock FROM ticker_tmp)
                                *
ERROR at line 1:
ORA-00904: "ID_STOCK": invalid identifier
 
 
Elapsed: 00:00:00.00
SQL> SELECT TABLE(f_daily_bar(id_stock)) FROM ticker_tmp;
SELECT TABLE(f_daily_bar(id_stock)) FROM ticker_tmp
       *
ERROR at line 1:
ORA-00936: missing expression
 
 
Elapsed: 00:00:00.00
SQL>
helas

fatsora est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h01.


 
 
 
 
Partenaires

Hébergement Web