viernes, 18 de marzo de 2011

un_alias_soluciona_1445

Workaround del ORA-01445 con un simple alias

He visto un ORA-01445 que cuando lo buscas hay incluso hasta un BUG reportado en la versión 10.2.0.3, sinceramente no sé por qué alguien quiere usar un ORDER BY de un ROWID. Pero el caso es que omitiendo las tablas he creado esta prueba en la que es básicamente algo parecido. Si alguien tiene este error puede probar agregando un alias a la columna de la tabla del rowid y “salta” el error.

Pruebas en 10.2.0.4 en Windows, 10.2.0.3|11.1.0.6|11.2.0.1 en linux

Limpiar el entorno

==================

SQL> drop table tab1 purge;

drop table tab1 purge

*

ERROR en lÝnea 1:

ORA-00942: la tabla o vista no existe

SQL> drop table tab2 purge;

drop table tab2 purge

*

ERROR en lÝnea 1:

ORA-00942: la tabla o vista no existe

SQL> drop table tab3 purge;

drop table tab3 purge

*

ERROR en lÝnea 1:

ORA-00942: la tabla o vista no existe

Crear entorno para prueba

=========================

SQL> create table tab1

2 (id number,

3 info varchar2(10));

Tabla creada.

SQL> create table tab2

2 (id number,

3* info varchar2(10))

Tabla creada.

SQL> create table tab3

2 (id number,

3* info varchar2(10))

Tabla creada.

Cargar las tablas

=================

SQL> insert into tab1

2 select rownum, 'a'||rownum

3 from dual

4 connect by rownum <= 20;

20 filas creadas.

SQL> insert into tab2

2 select rownum, 'a'||rownum

3 from dual

4* connect by rownum <= 50

50 filas creadas.

SQL> insert into tab3

2 select rownum, 'a'||rownum

3 from dual

4* connect by rownum <= 500

500 filas creadas.

SQL> commit;

Confirmaci¾n terminada.

SQL> select t1.id, ta2.info

2 from tab1 t1,

3 (select ta1.rowid, ta1.id, ta1.info

4 from tab2 t2,

5 (select rowid, id, info

6 from tab3

7 where id between 10 and 20) ta1

8 where ta1.id = t2.id) ta2

9 where t1.id = ta2.id

10* order by ta2.rowid

from tab1 t1,

*

ERROR en lÝnea 2:

ORA-01445: no se puede seleccionar ROWID, ni tomar un ejemplo, desde una vista de la uni¾n sin una tabla protegida por

Claves

SQL> select t1.id, ta2.info

2 from tab1 t1,

3 (select ta1.rowid r, ta1.id, ta1.info

4 from tab2 t2,

5 (select rowid, id, info

6 from tab3

7 where id between 10 and 20) ta1

8 where ta1.id = t2.id) ta2

9 where t1.id = ta2.id

10* order by ta2.r

ID INFO

---------- ----------

10 a10

11 a11

12 a12

13 a13

14 a14

15 a15

16 a16

17 a17

18 a18

19 a19

20 a20

11 filas seleccionadas.


Como ves es en ocasiones los errores pueden desviar la atención de la solución.




No hay comentarios:

Publicar un comentario