dbms_random.value – O necessário workaround

A semana passada falei aqui como o comportamento do dbms_random varia em função da versão do Oracle. No entanto, enquanto a discussão se passa já no forum do asktom, com opiniões bastante válidas deixo só aqui o workaround para obterem o mesmo comportamento que no 10g:


explain plan for select /*+ optimizer_features_enable('10.1.0') */ 1 from dual 

where dbms_random.value = dbms_random.value;

 

Como habitualmente vamos apenas dar uma olhada no plano:


> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Beta


> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 4034615273

-----------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time |
-----------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 2 (0)| 00:00:01 |
|* 1 | FILTER | | | | |
| 2 | FAST DUAL | | 1 | 2 (0)| 00:00:01 |
-----------------------------------------------------------------

Predicate Information (identified by operation id):

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
---------------------------------------------------

1 - filter("DBMS_RANDOM"."VALUE"()="DBMS_RANDOM"."VALUE"())

 

Novamente a função é chamada 2 vezes gerando dois números aleatórios diferentes pois o hint  optimizer_features_enable(‘10.1.0’) obriga o comportamento do optimizador para a versão em questão.

Não sei se isto servirá, na prática para alguma coisa, mas considerem apenas como um exercicio meramente teórico só para saber como funciona.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s