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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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