제가 10, 11, 12 전부 테스트해보았는데....
전부 오류입니다.
with base as
(
select dbms_random.value(1,100) v1 , dbms_random.value(1,100) v2 from dual
connect by level < 11
)
select
a.v1
,a.v2
,sum(a.v1) over () sum_v1
,sum(a.v2) over () sum_v2
from base a
/
이 SQL을 실행해보면 그 결과에서 sum_v1과 sum_v2의 결과가 동일하게 sum_v2로 나옵니다.
??
그런데...
:a := 100;
with base as
(
select dbms_random.value(1,100) v1 , dbms_random.value(1,:a) v2 from dual
connect by level < 11
)
select
a.v1
,a.v2
,sum(a.v1) over () sum_v1
,sum(a.v2) over () sum_v2
from base a
/
처럼하면 잘 됩니다.
그런데 다시
with base as
(
select dbms_random.value(1,:a) v1 , dbms_random.value(1,:a) v2 from dual
connect by level < 11
)
select
a.v1
,a.v2
,sum(a.v1) over () sum_v1
,sum(a.v2) over () sum_v2
from base a
/
이와 같이 하면 오류가 납니다...
아마도 함수값의 집계시 케싱과 관련한 오류가 아닐까 싶습니다.
dbms_random.value는 결정적 함수가 아닌데 이를 케싱하고 있는 것으로 생각됩니다.
그런데 그렇게 생각해도 이상한게....
다음과 같이 하면 다시 오류가 납니다.
with args as
(
select 100 v1,100.0 v2 from dual
)
, base as
(
select dbms_random.value(1,a.v1) v1 , dbms_random.value(1,a.v2) v2 from args a
connect by level < 11
)
select
a.v1
,a.v2
,sum(a.v1) over () sum_v1
,sum(a.v2) over () sum_v2
from base a
/
이상하죠? |