martes, 8 de septiembre de 2015

ORA-14223 (otra vez)


En Oracle 11.2.0.1 se puede crear una tabla con creación diferida. También es posible crear una tabla dividida. Pero si intentas crear una tabla dividida y con creación diferida, Oracle responde con un error ORA-14223:

Oracle 11.2.0.1 > sqlplus /
 
SQL*Plus: Release 11.2.0.1.0 Production on Lun Sep 7 18:42:12 2015
 
Copyright (c) 1982, 2009, Oracle.  All rights reserved.
 
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
 
SQL> create table tab1
  2  (col1 number)
  3  segment creation deferred
  4  /
 
Table created.
 
SQL> drop table tab1
  2  /
 
Table dropped.
 
SQL> create table tab1
  2  (col1 number)
  3  partition by range(col1)
  4  (partition part01
  5  values less than (maxvalue))
  6  /
 
Table created.
 
SQL> drop table tab1
  2  /
 
Table dropped.
 
SQL> create table tab1
  2  (col1 number)
  3  segment creation deferred
  4  partition by range(col1)
  5  (partition part01
  6  values less than (maxvalue))
  7  /
create table tab1
*
ERROR at line 1:
ORA-14223: No está soportada la creación de segmentos diferida para esta tabla
 
SQL> 

Si tienes que crear una table dividida y con creación diferida, es posible hacerlo en Oracle 11.2.0.2 como se puede ver en el último ejemplo bajo estas líneas:

Oracle 11.2.0.2 > sqlplus /
 
SQL*Plus: Release 11.2.0.2.0 Production on Mon Sep 7 18:46:17 2015
 
Copyright (c) 1982, 2010, Oracle.  All rights reserved.
 
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
 
SQL> create table tab1
  2  (col1 number)
  3  segment creation deferred
  4  partition by range(col1)
  5  (partition part01
  6  values less than (maxvalue))
  7  /
 
Table created.
 
SQL>

martes, 23 de junio de 2015

ORA-12838

Tras hacer un INSERT /*+ APPEND */, hay que ejecutar un COMMIT antes de leer o modificar la tabla. Si no lo haces, Oracle responde con un ORA-12838. Se puede ver lo que quiero decir en el ejemplo siguiente, que probé en Oracle 11.2:

SQL> create table tab1
  2  as select * from dba_tables
  3  where 1 = 2
  4  /
 
Table created.
 
SQL> insert /*+ append */ into tab1
  2  select * from dba_tables
  3  /
 
3163 rows created.
 
SQL> select count(*) from tab1
  2  /
select count(*) from tab1
                     *
ERROR at line 1:
ORA-12838: no se puede leer/modificar un objeto
después de modificarlo en paralelo
 
SQL> commit
  2  /
 
Commit complete.
 
SQL> select count(*) from tab1
  2  /
 
  COUNT(*)
----------
      3163
 
SQL>

En inglés

En francés 

30th October 2016:
Checked for relevance.
Shared on LinkedIn. 

lunes, 12 de enero de 2015

Natural Join y ORA-25155

Si quieres unir dos tablas o dos vistas y emplear las columnas que existen en ambos objetos para emparejarlos, se puede hacerlo con un natural join. Aquí está un ejemplo que probé en Oracle 11.2:

SQL> desc v$sesstat
Name                       Null?    Type
-------------------------- -------- ------------------
SID                                 NUMBER
STATISTIC#                          NUMBER
VALUE                               NUMBER
 
SQL> desc v$statname
Name                       Null?    Type
-------------------------- -------- ------------------
STATISTIC#                          NUMBER
NAME                                VARCHAR2(64)
CLASS                               NUMBER
STAT_ID                             NUMBER
 
SQL> select value/100 "CPU_Used"
  2  from v$sesstat natural join v$statname
  3  where sid = 101
  4  and name = 'CPU used by this session'
  5  /
 
  CPU_Used
----------
     40.07
 
SQL>

No se puede poner el nombre del objeto antes del nombre de la columna. Si lo haces, Oracle responde con un error ORA-25155:

SQL> select value/100 "CPU_Used"
  2  from v$sesstat natural join v$statname
  3  where sid = 101
  4  and name = 'CPU used by this session'
  5  and v$sesstat.statistic# = v$statname.statistic#
  6  /
and v$sesstat.statistic# = v$statname.statistic#
                           *
ERROR at line 5:
ORA-25155: column used in NATURAL join cannot have
qualifier
 
SQL>

Tampoco se puede emplear un alias para el objeto en un natural join:

SQL> select value/100 "CPU_Used"
  2  from v$sesstat a natural join v$statname b
  3  where sid = 101
  4  and name = 'CPU used by this session'
  5  and a.statistic# = b.statistic#
  6  /
and a.statistic# = b.statistic#
                   *
ERROR at line 5:
ORA-25155: column used in NATURAL join cannot have
qualifier
 
SQL>

jueves, 8 de enero de 2015

ORA-30506

Si intentas a crear un logon trigger de la manera siguiente, Oracle responde con un error ORA-30506:
 
SQL> create or replace trigger immediate_trace
  2  after logon on etl_job_run
  3  begin
  4  execute immediate 'alter session set sql_trace=true';
  5  end;
  6  /
after logon on etl_job_run
               *
ERROR at line 2:
ORA-30506: system triggers cannot be based on tables or views
 
SQL>
 
Esto no explica la razón verdadera para el problema. Tras añadir la palabra schema al fin de la segunda línea, el problema desaparece:
 
SQL> create or replace trigger immediate_trace
  2  after logon on etl_job_run.schema
  3  begin
  4  execute immediate 'alter session set sql_trace=true';
  5  end;
  6  /
 
Trigger created.
 
SQL>