jueves, 20 de noviembre de 2014

¿Porqué Tuve Que Borrar Esta Tabla Dos Veces?

Hallé este ejemplo en un sitio inglés y decidí traducirlo para los hispanohablantes. Lo he probado en Oracle 9.2 y Oracle 11.2 lo que quiere decir que la versión no sea demasiado importante. Un usuario que se llama Fred se conecta a una base de datos: 

SQL> conn fred/bloggs
Connected.
SQL>

Tiene solamente una sesión y no hay nadie más en la base de datos:

SQL> select username from v$session
  2  where username is not null
  3  /
 
USERNAME
------------------------------
FRED

SQL>

... y su usuario es vacio:

SQL> select count(*) from user_objects
  2  /
 
  COUNT(*)
----------
         0
 
SQL>

Fred crea una tabla, ejecuta unos comandos de SQL y intenta a borrar la tabla. Cuando lo hace por primera vez, ve dos errores que no te he mostrado:

SQL> drop table tab1
  2  /
drop table tab1
*
ERROR at line 1:
ORA-?????
ORA-?????
 
SQL>

Cuando lo hace por segunda vez, no hay problemas:

SQL> drop table tab1
  2  /
 
Table dropped.
 
SQL>

Yo necesito saber:
  1.  ¿Cómo fue creada la tabla?
  2. ¿Cuáles fueron los comandos de SQL?
  3. ¿Cuáles errores ha visto Fred?
Si sabes las respuestas puedes ponerlas en un comentario bajo estas líneas.

martes, 18 de noviembre de 2014

OR No Es Siempre Conmutativa

Hallé la idea para este ejemplo aquí y decidí traducirlo para los hispanohablantes. La palabra OR suele ser conmutativa en Oracle y por eso los resultados de los comandos siguientes deberían ser iguales: 

select * from t where p=q or not p=q

y

select * from t where not p=q or p=q 

Pero en Oracle 9.2.0.7 y Oracle 10.2.0.3 los dos comandos daban resultados diferentes como se puede ver en el ejemplo que sigue: 

SQL> col p format a20
SQL> col q format a20
SQL> create type point as object (x real, y real)
  2  /
 
Type created.
 
SQL> create table t (p point, q point)
  2  /
 
Table created.
 
SQL> insert into t values
  2  (point(null, null), point(null,null))
  3  /
 
1 row created.
 
SQL> insert into t values
  2  (point(1, null), point(1,null))
  3  /
 
1 row created.
 
SQL> insert into t values (point(1, 2), point(1,2))
  2  /
 
1 row created.
 
SQL> select * from t
  2  /
 
P(X, Y)              Q(X, Y)
-------------------- --------------------
POINT(NULL, NULL)    POINT(NULL, NULL)
POINT(1, NULL)       POINT(1, NULL)
POINT(1, 2)          POINT(1, 2)
 
SQL> select * from t where p=q or not p=q
  2  /
 
P(X, Y)              Q(X, Y)
-------------------- --------------------
POINT(1, 2)          POINT(1, 2)
 
SQL> select * from t where not p=q or p=q
  2  /
 
P(X, Y)              Q(X, Y)
-------------------- --------------------
POINT(1, NULL)       POINT(1, NULL)
POINT(1, 2)          POINT(1, 2)
 
SQL> 

Creo que fuese causado por un error porque en Oracle 11.2.0.1, el problema había desaparecido: 

SQL> col p format a20
SQL> col q format a20
SQL> create type point as object (x real, y real)
  2  /
 
Type created.
 
SQL> create table t (p point, q point)
  2  /
 
Table created.
 
SQL> insert into t values
  2  (point(null, null), point(null,null))
  3  /
 
1 row created.
 
SQL> insert into t values
  2  (point(1, null), point(1,null))
  3  /
 
1 row created.
 
SQL> insert into t values (point(1, 2), point(1,2))
  2  /
 
1 row created.
 
SQL> select * from t
  2  /
 
P(X, Y)              Q(X, Y)
-------------------- --------------------
POINT(NULL, NULL)    POINT(NULL, NULL)
POINT(1, NULL)       POINT(1, NULL)
POINT(1, 2)          POINT(1, 2)
 
SQL> select * from t where p=q or not p=q
  2  /
 
P(X, Y)              Q(X, Y)
-------------------- --------------------
POINT(1, 2)          POINT(1, 2)
 
SQL> select * from t where not p=q or p=q
  2  /
 
P(X, Y)              Q(X, Y)
-------------------- --------------------
POINT(1, 2)          POINT(1, 2)
 
SQL>

domingo, 9 de noviembre de 2014

Archivos de Control

Aquí está una pregunta para ayudaros a estudiar para el examen OCA:

¿Cuántos archivos de control puede tener una base de datos?

A. Cuatro
B. Ocho
C. Doce
D. No hay límite


Probé la respuesta así. Hice ocho copias del archivo de control: 

C:\>dir CF*
Volume in drive C has no label.
Volume Serial Number is 269C-9AD9
 
Directory of C:\
 
05/11/2014  17:50        10,043,392 CF1
05/11/2014  17:50        10,043,392 CF2
05/11/2014  17:50        10,043,392 CF3
05/11/2014  17:50        10,043,392 CF4
05/11/2014  17:50        10,043,392 CF5
05/11/2014  17:50        10,043,392 CF6
05/11/2014  17:50        10,043,392 CF7
05/11/2014  17:50        10,043,392 CF8
               8 File(s)     80,347,136 bytes
               0 Dir(s)  12,114,571,264 bytes free
 
C:\>

Cambié el parámetro control_files de la manera siguiente:

control_files='C:\CF1','C:\CF2','C:\CF3','C:\CF4','C:\CF5','C:\CF6','C:\CF7','C:\CF8'

Abrí la base de datos y comprobé que había ocho archivos de control:

C:\Users\Andrew>sqlplus / as sysdba
 
SQL*Plus: Release 12.1.0.1.0 Production on Mié Nov 5 17:48:49 2014
 
Copyright (c) 1982, 2013, Oracle.  All rights reserved.
 
Conectado a una instancia inactiva.
 
SQL> startup
Instancia ORACLE iniciada.
 
Total System Global Area 1043886080 bytes
Fixed Size                  2410568 bytes
Variable Size             566233016 bytes
Database Buffers          469762048 bytes
Redo Buffers                5480448 bytes
Base de datos montada.
Base de datos abierta.
SQL> col name format a30
SQL> select name from v$controlfile
  2  /
 
NAME
------------------------------
C:\CF1
C:\CF2
C:\CF3
C:\CF4
C:\CF5
C:\CF6
C:\CF7
C:\CF8
 
8 filas seleccionadas.
 
SQL>

Repetí el procedimiento con nueve archivos de control pero esta vez no podía abrir la base de datos:

C:\Users\Andrew>sqlplus / as sysdba
 
SQL*Plus: Release 12.1.0.1.0 Production on Mié Nov 5 17:56:50 2014
 
Copyright (c) 1982, 2013, Oracle.  All rights reserved.
 
Conectado a una instancia inactiva.
 
SQL> startup
Instancia ORACLE iniciada.
 
Total System Global Area 1043886080 bytes
Fixed Size                  2410568 bytes
Variable Size             566233016 bytes
Database Buffers          469762048 bytes
Redo Buffers                5480448 bytes
ORA-03113: fin de archivo en el canal de comunicación
Identificador de Proceso: 2820
Identificador de Sesión: 240 Número de Serie: 3
 
SQL> exit
Desconectado de Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
 
C:\Users\Andrew>

Vi el error siguiente en el archivo alert:

Wed Nov 05 17:57:05 2014
Errors in file C:\APP\ADMINISTRATOR\diag\rdbms\orcl1\orcl1\trace\orcl1_ckpt_2592.trc:
ORA-00208: el numero de nombres de archivos de control excede el limite de 8
Wed Nov 05 17:57:06 2014 

Por eso, la respuesta es B.

lunes, 3 de noviembre de 2014

Conexión Como SYSDBA

Aquí está una pregunta para ayudaros a estudiar para el examen OCA:

Acabo de conectarme a una base de datos así:

SQL> conn fred/bloggs as sysdba
Conectado.
SQL>

¿Cuál usuario estoy empleando en la base?

A. SYS
B. PUBLIC
C. SYSTEM
D. FRED
E. SYSDBA

Probé la respuesta en Oracle 11.2:

SQL> show user
USER is "SYS"
SQL>

Por eso la respuesta es A.