create function having, Select...Model , returns error..
652211Aug 29 2008 — edited Aug 30 2008can anyone Suggest me with the corrections please.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL> ed wtag
SQL> create or replace function get_wtavg(p_BROK_code IN varchar2, p_SECURIT_code IN varchar2, p_DATE IN DATE)
2 return number Is
3 BEGIN
4 select avgprice
5 from (
6 select t.*
7 from (
8 select seq_no
9 , invxh_DATE
10 , INVXH_code
11 , invxh_No
12 , invxH_total_qty
13 , INVXH_net_AMOUNT_Scy INVXH_net_AMOUNT_Scy
14 , balqty
15 , ROUND(balamt, 3) balamt
16 , ROUND(avgprice, 10) avgprice
17 , ROUND(cost, 3) cost
18 from (select b.*,
19 sum(decode(invxh_code, 'BUY', INVXH_total_QTY, -INVXH_total_QTY)) OVER (ORDER BY INVXh_DATE) BALQTY,
20 row_number() over (order by INVXH_date) seq_no
21 from invs_TXN_head b
22 where INVXH_BROK_code = P_brok_code
23 aND INVXH_Securit_CODE = p_SECURIT_code
24 and INVXH_date < to_CHAR(p_DATE,'dd/mm/yyyy'))
25 model
26 dimension by (seq_no)
27 measures (invxh_DATE
28 , INVXh_code
29 , INVXH_no
30 , INVXH_total_qty
31 , balqty
32 , INVXH_net_AMOUNT_Scy
33 , 0 balamt
34 , 0 balamt2
35 , 0 avgprice
36 , 0 cost)
37 rules (
38 balamt[seq_no is any] = nvl(balamt[cv() - 1], 0) +
39 decode(INVXH_code[cv()], 'BUY', INVXH_net_AMOUNT_Scy[cv()] , -(balamt[cv() -1] /
40 balqty[cv() -1] * invxh_TOTAL_qty[cv()]) ) ,
41 cost[seq_no is any] = decode(INVXH_code[cv()], 'SEL', balamt[cv() -1] /
42 balqty[cv() -1] * invxh_TOTAL_qty[cv()], 0),
43 avgprice[seq_no is any] = decode(INVXH_code[cv()], 'BUY', balamt[cv()] /
44 balqty[cv()] , avgprice[cv() - 1])
45 )
46 ) t
47 order by seq_no desc
48 ) where rownum = 1
49 RETURN avgprice;
50 END GET_wtavg;
51 /
Warning: Function created with compilation errors.
SQL> show error
Errors for FUNCTION GET_WTAVG:
LINE/COL ERROR
-------- -----------------------------------------------------------------
*4/1 PL/SQL: SQL Statement ignored*
*48/21 PL/SQL: ORA-00933: SQL command not properly ended*
SQL>
it works well, if i dont put it in a Stored function;
select avgprice
from (
select t.*
from (
select seq_no
, invxh_DATE
, INVXH_code
, invxh_No
, invxH_total_qty
, INVXH_net_AMOUNT_Scy INVXH_net_AMOUNT_Scy
, balqty
, ROUND(balamt, 3) balamt
, ROUND(avgprice, 10) avgprice
, ROUND(cost, 3) cost
from (select b.*,
sum(decode(invxh_code, 'BUY', INVXH_total_QTY, -INVXH_total_QTY)) OVER (ORDER BY INVXh_DATE) BALQTY,
row_number() over (order by INVXH_date) seq_no
from invs_TXN_head b
where INVXH_BROK_code = 'B00001'
aND INVXH_Securit_CODE = 'S00001'
and INVXH_date < to_DATE('25/02/2008','dd/mm/yyyy'))
model
dimension by (seq_no)
measures (invxh_DATE
, INVXh_code
, INVXH_no
, INVXH_total_qty
, balqty
, INVXH_net_AMOUNT_Scy
, 0 balamt
, 0 balamt2
, 0 avgprice
, 0 cost)
rules (
balamt[seq_no is any] = nvl(balamt[cv() - 1], 0) +
decode(INVXH_code[cv()], 'BUY', INVXH_net_AMOUNT_Scy[cv()] , -(balamt[cv() -1] /
balqty[cv() -1] * invxh_TOTAL_qty[cv()]) ) ,
cost[seq_no is any] = decode(INVXH_code[cv()], 'SEL', balamt[cv() -1] /
balqty[cv() -1] * invxh_TOTAL_qty[cv()], 0),
avgprice[seq_no is any] = decode(INVXH_code[cv()], 'BUY', balamt[cv()] /
balqty[cv()] , avgprice[cv() - 1])
)
) t
order by seq_no desc
) where rownum = 1
/
AVGPRICE
----------------
2.1761218756
THE RAW DATA Is;
1 select invxh_DATE
2 , INVXH_code
3 , invxh_No
4 , invxH_total_qty
5 , INVXH_net_AMOUNT_Scy
6 from invS_txn_HEAD
7 where INVXH_BROK_code = 'B00001'
8 aND INVXH_Securit_CODE = 'S00001'
9* and INVXH_date < to_DATE('25/02/2008','dd/mm/yyyy')
SQL> /
INVXH_DAT INVXH_ INVXH_NO INVXH_TOTAL_QTY INVXH_NET_AMOUNT_SCY
--------- ------ ------------- --------------- --------------------
03-JAN-08 BUY 1.000 75000.000 166593.158
06-JAN-08 BUY 2.000 35000.000 80717.835
07-JAN-08 BUY 3.000 50000.000 108432.000
20-JAN-08 BUY 4.000 50000.000 105316.613
22-JAN-08 BUY 5.000 15000.000 28567.816