Nvidal’s Blog

Just another WordPress.com weblog

Comportamiento de los redos y la sentencia Commit

Cuando una transacción es actualizada, una entrada al redo log correspondiente al update es registrada. Oracle registra este redo en un buffer de memoria hasta que se complete la transacción. Cuando el commit es ejecutado, el proceso log writer (LGWR) escribe redo del commit, junto con los redos acumulados de todos los cambios en la transacción, a disco. Por defecto la base de datos oracle escribe todo los redo a disco. Este comportamiento introduce una latencia en el commit porque la aplicación debe esperar que el redo sea registrado en el disco.

Suponiendo que estés escribiendo una aplicación que requiera procesar una gran cantidad de transacciones. Si deseas manejar el comportamiento del commit por poca latencia, tienes que cambiar la opción por defecto del COMMIT para que la aplicación no tenga la necesidad de esperar porque la base de datos oracle escriba en los redo log.

La base de datos oracle cambia el manejo del commit dependiendo la necesidad de la aplicación. Puedes cambiar el comportamiento del commit de la siguiente forma:

■ COMMIT_WRITE initialization parameter at the system or session level
■ COMMIT statement

La sentencia COMMIT sobre escribe el valor actual del parámetro de inicialización.

Para establecer las opciones de commit y cambiar su comportamiento se puede hacer utilizando el parámetro de inicialización COMMIT_WRITE con los siguientes valores:

WAIT: El commit no retorna satisfactorio hasta que el correspondiente redo del commit sea registrado en el online redo logs, este es el valor por defecto.

NOWAIT: El commit debe retornar a la aplicación sin esperar que el redo a ser escrito sea registrado en el online redo logs.

IMMEDIATE: El proceso log writer debe escribir el redo del commit inmediatamente, este es el default. Esta opción fuerza a realizar operación de I/O en el disco.

BATCH: La base de datos oracle hace un buffer del redo. EL proceso de log writer permite escribir el redo a disco en su propio momento.
Ejemplos de cómo definir el comportamiento del COMMIT usando el parámetro de inicialización y/o ALTER SYSTEM o ALTER SESSION

COMMIT_WRITE
Es un parámetro avanzado usado para controlar como las transacciones commit serán escritas a los redo logs. IMMEDIATE y BATCH controlan como los redos serán manejados por el log writer. El WAIT y NOWAIT controlan cuando el redo del commit es vaciado en el redo logs.

COMMIT_WRITE = IMMEDIATE, WAIT (Default)
COMMIT_WRITE = IMMEDIATE, NOWAIT
COMMIT_WRITE = BATCH, NOWAIT
COMMIT_WRITE = BATCH, WAIT

Con ALTER:
ALTER SYSTEM SET COMMIT_WRITE = BATCH, NOWAIT
ALTER SYSTEM SET COMMIT_WRITE = BATCH, NOWAIT

También puedes utilizarlo a nivel de la aplicación con las siguientes opciones:
COMMIT WRITE BATCH NOWAIT
COMMIT WRITE BATCH WAIT
COMMIT WRITE IMMEDIATE NOWAIT (Default)
COMMIT WRITE IMMEDIATE WAIT

Si solamente IMMEDIATE o BATCH es especificado, sin WAIT o NOWAIT, WAIT es asumido.
Si solamente WAIT o NOWAIT es especificado, sin IMMEDIATE o BATCH, IMMEDIATE es asumido.

septiembre 28, 2009 Posted by | Database, Developer, Oracle | Deja un comentario

Manejo de Memoria 10g y 11g (Continuacion)

Automatic Shared Memory Management (ASMM)

Este es una forma automática de manejar el SGA, esta característica está definida desde la versión 10G, es la forma más fácil de manejar el SGA, dejando que sea la base de datos oracle quien maneje la estructura de memoria del SGA.  En la versión 11G hay otra característica la cual maneja de forma automática no solo el SGA, también el PGA. (Ver artículo publicado de Manejo de  Memoria 11G).

El manejo automático de la memoria compartida simplifica el manejo del SGA. Especificar la cantidad de memoria disponible a una instancia usando el parámetro de inicialización SGA_TARGET y la base de dato oracle distribuye automático entre varios componentes del SGA para asegurar una utilización efectiva de la memoria.

Cuando se habilita el manejo automático del SGA,  el tamaño de los diferentes componentes son flexibles y pueden adaptarse a las necesidades de cargas de trabajo sin requerir configuración adicional. La base de datos distribuye automáticamente la memoria disponible entre varios componentes, permitiendo al sistema maximizar el uso de toda la memoria del SGA disponible.

Para habilitar el manejo automático de la memoria compartida solo tienes que definir el parámetro de inicialización SGA_TARGET a un valor mayor que cero.

La vista V$SGAINFO provee información sobre el tamaño actual de varios componentes del SGA.

La vista V$SGA_TARGET_ADVICE provee información que ayudan a decidir el valor de SGA_TARGET.

select * from v$sga_target_advice order by sga_size;

Habilitando  Automatic Shared Memory Management

1. Run the following query to obtain a value for SGA_TARGET:

SELECT ((SELECT SUM(value) FROM V$SGA) – (SELECT CURRENT_SIZE FROM V$SGA_DYNAMIC_FREE_MEMORY)) «SGA_TARGET» FROM DUAL;

2. Set the value of SGA_TARGET, either by editing the text initialization parameter file and restarting the database, or by issuing the following statement:

ALTER SYSTEM SET SGA_TARGET=value [SCOPE={SPFILE|MEMORY|BOTH}]

where value is the value computed in step 1 or is some value between the sum of all SGA component sizes and SGA_MAX_SIZE. For more information on the

ALTER SYSTEM statement and its SCOPE clause, see Oracle Database SQL Language Reference.

3. Do one of the following:

For more complete automatic tuning, set the values of the automatically sized SGA components listed below to zero. Do this by editing the text initialization parameter file or by issuing ALTER SYSTEM statements.

You can take advantage of automatic shared memory management by setting Total SGA Size to 992M in Oracle Enterprise Manager, or by issuing the following statements:

ALTER SYSTEM SET SGA_TARGET = nM;

ALTER SYSTEM SET SHARED_POOL_SIZE = 0;

ALTER SYSTEM SET LARGE_POOL_SIZE = 0;

ALTER SYSTEM SET JAVA_POOL_SIZE = 0;

ALTER SYSTEM SET DB_CACHE_SIZE = 0;

ALTER SYSTEM SET STREAMS_POOL_SIZE = 0;

septiembre 21, 2009 Posted by | Database | 1 comentario

Manejo de memoria 11G (New Features)

 Manejo de memoria en 11G

Oracle 10g introduce un cambio en el uso de la memoria, la separación del SGA y el PGA como estructura de memoria independiente y la configuración automática  en las áreas de SGA (ASMM). Esto caracterizo sin dudas  un gran avance.  La memoria compartida SGA contiene información y datos de control de una instancia, comprendido por los procesos server y lo procesos de backgroud, y el PGA, que es una región de memoria no compartida que contiene información y data de control de los procesos server. La versión 11G release 2 nos trae un manejo totalmente automático de la memoria SGA y PGA (AMM) y no solo del SGA (ASMM). aunque sigue soportando la opción de manejo manual de la memoria y configuración del manejo automático de memoria compartida  SGA.

El manejo de la memoria envuelve mantener el tamaño óptimo de la instancia de oracle según la  demanda de los cambios en la base de datos, el manejo de la memoria configurada manualmente se convierte en una configuración estática, si la instancia necesita más memoria para cualquiera de su estructura la misma no cambia, todo lo contrario cuando tenemos una configuración automática en donde el valor de la memoria se ajusta a los requerimientos de la instancia, si hay memoria disponible, oracle puede aumentar cualquiera de las áreas que demanden mas memoria e igualmente puede reducir su tamaño si los requerimientos no demandan toda la memoria configurada el SGA y PGA.

La mejor forma de manejar la memoria de una instancia es permitir a la instancia de oracle manejarla automáticamente y optimizarla por ti. Con solo definir el parámetro MEMORY_TARGET y opcionalmente MEMORY_MAX_TARGET. La instancia optimiza el tamaño de la memoria, redistribuye memoria a requerimiento entre el SGA y el PGA. Como el manejo de la memoria es dinámico, puedes cambiarla en cualquier momento sin reiniciar la base de datos. El tamaño máximo (MEMORY_MAX_TARGET) sirve como el tamaño limite así que no puedes definir este tamaño demasiado alto y si el mismo no es definido será igual a MEMORY_TARGET.

Definiendo el Manejo de Memoria automático envuelve bajar y subir la base de datos.

1. Start SQL*Plus and connect to the database as SYSDBA.

2. Calculate the minimum value for MEMORY_TARGET as follows:

a. Determine the current sizes of SGA_TARGET and PGA_AGGREGATE_TARGET by entering the following SQL*Plus command:

SHOW PARAMETER TARGET

SQL*Plus displays the values of all initialization parameters with the string TARGET in the parameter name.

NAME                                                            TYPE        VALUE

——————————                       ———– —————-

archive_lag_target                                 integer     0

db_flashback_retention_target       integer     1440

fast_start_io_target                              integer     0

fast_start_mttr_target                        integer     0

memory_max_target big                   integer     0

memory_target big                               integer     0

pga_aggregate_target big                   integer     90M

sga_target big                                          integer     272M

b. Run the following query to determine the maximum instance PGA allocated

since the database was started:

select value from v$pgastat where name=’maximum PGA allocated’;

c. Compute the maximum value between the query result from step 2b and

PGA_AGGREGATE_TARGET. Add SGA_TARGET to this value.

memory_target = sga_target + max(pga_aggregate_target, maximum PGA

allocated)

For example, if SGA_TARGET is 272M and PGA_AGGREGATE_TARGET is 90M as

shown above, and if the maximum PGA allocated is determined to be 120M, then

MEMORY_TARGET should be at least 392M (272M + 120M).

3. Choose the value for MEMORY_TARGET that you want to use.

This can be the minimum value that you computed in step 2, or you can choose to

use a larger value if you have enough physical memory available.

4. For the MEMORY_MAX_TARGET initialization parameter, decide on a maximum

amount of memory that you would want to allocate to the database for the

foreseeable future. That is, determine the maximum value for the sum of the SGA

and instance PGA sizes. This number can be larger than or the same as the

MEMORY_TARGET value that you chose in the previous step.

5. Do one of the following:

■ If you started your Oracle Database instance with a server parameter file,

which is the default if you created the database with the Database

Configuration Assistant (DBCA), enter the following command:

ALTER SYSTEM SET MEMORY_MAX_TARGET = nM SCOPE = SPFILE;

where n is the value that you computed in Step 4.

The SCOPE = SPFILE clause sets the value only in the server parameter file,

and not for the running instance. You must include this SCOPE clause because

MEMORY_MAX_TARGET is not a dynamic initialization parameter.

■ If you started your instance with a text initialization parameter file, manually

edit the file so that it contains the following statements:

memory_max_target = nM

memory_target = mM

where n is the value that you determined in Step 4, and m is the value that you

determined in step 3.

6. Shut down and restart the database.

See Chapter 3, «Starting Up and Shutting Down» on page 3-1 for instructions.

7. If you started your Oracle Database instance with a server parameter file, enter the

following commands:

ALTER SYSTEM SET MEMORY_TARGET = nM;

ALTER SYSTEM SET SGA_TARGET = 0;

ALTER SYSTEM SET PGA_AGGREGATE_TARGET = 0;

Monitoring and Tuning Automatic Memory Management:

select * from v$memory_target_advice order by memory_size;

(Continuara …)

septiembre 21, 2009 Posted by | Database, Oracle | 1 comentario

Resumable space allocation

Resumable space allocation es una forma eficiente de mantener un proceso de larga duración en ejecución si la necesidad que el mismo aborte cuando se produzcan problemas de falta de espacios o que un export/import falle por la misma razón. Esto no es más que una forma eficiente de ahorrar tiempo y garantía de que las operaciones no fallen por falta de espacios o desbordamiento de los máximos tamaños de crecimientos definidos. Cuántas veces hemos visto un proceso en fase de finalización abortar por falta de espacio y tener que iniciarlo desde el inicio, o haciendo un import de una tabla gigante abortando al borde de la finalización, be my guess!

Managing Resumable Space Allocation

Oracle provee la forma de suspender y luego resumir la ejecución operaciones de la base de datos cuando ocurre un evento de fallas por alojamiento de espacio. Puedes tomar
Acciones correctivas envés que el servidor de oracle retorne un error al usuario. Después que el error es corregido, la operación suspendida automáticamente retoma la operación.
Esta característica de oracle es llamada Resumable Space Allocation. Las sentencias que son afectadas son llamadas resumable statements.

Como trabaja esto

1. Una sentencia se ejecuta en modo resumable solo si su sesión ha sido habilitada para resumable space allocation por una de la siguiente razón:

El RESUMABLE_TIMEOUT, parámetro de inicialización, es un valor mayor que cero.

El ALTER SESSION ENABLE RESUMABLE es ejecutado

2. Una sentencia resumable es suspendida cuando una de la siguiente condición ocurre:

• No espacio
• Máximo extents alcanzado
• Cuota de espacio excedida

3. Cuando la ejecución de una sentencia resumable es suspendida, hay mecanismos para ejecutar operaciones suplidora al usuario, log de errores y búsqueda del estado de la ejecución. Cuando una sentencia resumable es suspendida la siguientes acciones es tomada:

El error es reportado en Alert log.

El sistema activa una alerta de suspensión de la sesión
si el usuario tiene registrado un trigger AFTER SUSPEND, el trigger del usuario es ejecutado. Puedes utilizar un PL/SQL procedure para el acceso al mensaje de error usando el
Paquete DBMS_RESUMABLE y/o la vista el DBA_ o USER_RESUMABLE.

4. Suspendiendo la sentencia automáticamente resulta en suspender la transacción. Todos los recursos transaccionales son detenido atreves de la sentencia suspend o resume.

5. Cuando la condición de error es resuelta (como resultado de la intervención o quizás la liberación de espacio por otras sentencias), la sentencia suspendida automáticamente
Resume la ejecución y la alerta de la sesión resumable es limpiada.

6. Una sentencia suspendida puede forzar a terminar la ejecución usando el procedimiento DBMS_RESUMABLE.ABORT(). Este procedimiento puede ser llamado por un DBA o por el usuario que inicio la operación.

7. Una suspensión con intervalo de tiempo es asociada con una sentencia resumable. Una sentencia resumable que es suspendida por intervalo de tiempo (Default 2 horas) despierta y retorna la ejecución al usuario.

8. Una sentencia resumable puede ser suspendida y resumida múltiple veces durante su ejecución.

Las operaciones que son resumable son:

■ Queries
Las sentencias de SELECT que se quedan sin espacios temporales (por área de sort) son candidatas para ejecuciones resumable.

■ DML

INSERT, UPDATE, y DELETE son candidatos. También, INSERT INTO…SELECT de tablas externas pueden ser resumable.

■ Import/Export

■ DDL

Las siguientes sentencias son candidatas para ejecuciones resumable:

– CREATE TABLE … AS SELECT
– CREATE INDEX
– ALTER INDEX … REBUILD
– ALTER TABLE … MOVE PARTITION
– ALTER TABLE … SPLIT PARTITION
– ALTER INDEX … REBUILD PARTITION
– ALTER INDEX … SPLIT PARTITION
– CREATE MATERIALIZED VIEW
– CREATE MATERIALIZED VIEW LOG

Hay tres tipos de errores que pueden ser corregidos:

■ No espacio

La operacion no puede adquirir más extents por tabla/indice/temporalsegment/undo segment/cluster/LOB/Tabla e índice particionado en un tablespace. Por ejemplo, los siguientes
errores caen en esa categorías:

ORA-1653 unable to extend table … in tablespace …
ORA-1654 unable to extend index … in tablespace …

■ Máximo estents alcanzado

El numero de extents en table/index/temporary segment/undo segment/cluster/LOB/table partition/index partition igual al máximo de extents definido. Por ejemplo, los siguientes
errores caen en esa categorías:

ORA-1631 max # extents … reached in table …
ORA-1654 max # extents … reached in index …

■ Cuotas de espacio excedidas

La cuota del usuario, asignada en el tablespace, ha sido excedida. Por ejemplo, los siguientes errores caen en esas categorías:

ORA-1536 space quote exceeded for tablespace string

Habilitando y deshabilitando Resumable space allocation

Esto es posible cuando las sentencias son ejecutadas con un valor en el parámetro de inicialización RESUMABLE_TIMEOUT.

Por ejemplo, para habilitar resumable space allocation por 1 hora:

RESUMABLE_TIMEOUT = 3600

Si el parámetro es 0, entonces resumable space allocation es deshabilitado. Este es el default.

También puedes usar ALTER SYSTEM SET para cambiar el valor al parámetro a nivel del todo el sistema.

ALTER SYSTEM SET RESUMABLE_TIMEOUT=0;

A nivel de la sesión puedes habilitar o deshabilitar resumable space allocation.

ALTER SESSION ENABLE RESUMABLE;
ALTER SESSION DISABLE RESUMABLE;
ALTER SESSION ENABLE RESUMABLE TIMEOUT 3600;

Usando un LOGON trigger para definer el modo resumable

Otro método de definir el valor por defecto para el modo resumable, otro que el definir el parámetro de inicialización RESUMABLE_TIMEOUT, es registrar al nivel de la base de datos un Trigger LOGON para alterar la sesiones de los usuarios alterando resumable y definir el intervalo de tiempo.

Detectar sentencias suspendidas

Cuando una sentencia resumable es suspendida, el error no es disparado al cliente. En orden para una acción correctiva a ser tomada, la base de dato oracle provee métodos alternativos para notificar al usuario del error y proveer información acerca de las circunstancias.

Notificación al usuario: El evento AFTER SUSPEND y trigger

Cuando una sentencia resumable encuentra un error corregible, el sistema internamente genera el evento AFTER SUSPEND. Los usuarios pueden registrar triggers para este evento a nivel de la base de datos y del esquema. Si el usuario registra un trigger para manejar este evento del sistema, el trigger es ejecutado después de que la sentencia SQL ha sido suspendida.
En el siguiente ejemplo, el valor por defecto del intervalo de tiempo es cambiado por crear un trigger AFTER SUSPEND que llama a DBMS_RESUMABLE para definir el intervalo de tiempo a 3 horas.

CREATE OR REPLACE TRIGGER resumable_default_timeout
AFTER SUSPEND
ON DATABASE
BEGIN
DBMS_RESUMABLE.SET_TIMEOUT(10800);
END;

En el siguiente ejemplo, un trigger AFTER SUSPEND es creado y registrado como el usuario SYS a nivel de la base da dato. Cuando una sentencia resumable es suspendida en cualquier sesión, este trigger pude tener dos efectos:

■ Si un undo segment ha alcanzado su limite de espacio, entonces un mensaje es enviado al DBA y la sentencia es abortada.

■ Si cualquier otro error recuperable, el intervalo de tiempo es cambiado a 8 horas.

CREATE OR REPLACE TRIGGER resumable_default
AFTER SUSPEND
ON DATABASE
DECLARE
/* declare transaction in this trigger is autonomous */
/* this is not required because transactions within a trigger
are always autonomous */
PRAGMA AUTONOMOUS_TRANSACTION;
cur_sid NUMBER;
cur_inst NUMBER;
errno NUMBER;
err_type VARCHAR2;
object_owner VARCHAR2;
object_type VARCHAR2;
table_space_name VARCHAR2;
object_name VARCHAR2;
sub_object_name VARCHAR2;
error_txt VARCHAR2;
msg_body VARCHAR2;
ret_value BOOLEAN;
mail_conn UTL_SMTP.CONNECTION;
BEGIN
— Get session ID
SELECT DISTINCT(SID) INTO cur_SID FROM V$MYSTAT;
— Get instance number
cur_inst := userenv(‘instance’);
— Get space error information
ret_value :=
DBMS_RESUMABLE.SPACE_ERROR_INFO(err_type,object_type,object_owner,
table_space_name,object_name, sub_object_name);
/*
— If the error is related to undo segments, log error, send email
— to DBA, and abort the statement. Otherwise, set timeout to 8 hours.

— sys.rbs_error is a table which is to be
— created by a DBA manually and defined as
— (sql_text VARCHAR2(1000), error_msg VARCHAR2(4000),
— suspend_time DATE)
*/

IF OBJECT_TYPE = ‘UNDO SEGMENT’ THEN
/* LOG ERROR */
INSERT INTO sys.rbs_error (
SELECT SQL_TEXT, ERROR_MSG, SUSPEND_TIME
FROM DBMS_RESUMABLE
WHERE SESSION_ID = cur_sid AND INSTANCE_ID = cur_inst
);

SELECT ERROR_MSG INTO error_txt FROM DBMS_RESUMABLE
WHERE SESSION_ID = cur_sid and INSTANCE_ID = cur_inst;

— Send email to receipient via UTL_SMTP package
msg_body:=’Subject: Space Error Occurred
Space limit reached for undo segment ‘ || object_name ||
on ‘ || TO_CHAR(SYSDATE, ‘Month dd, YYYY, HH:MIam’) ||
‘. Error message was ‘ || error_txt;
mail_conn := UTL_SMTP.OPEN_CONNECTION(‘localhost’, 25);
UTL_SMTP.HELO(mail_conn, ‘localhost’);
UTL_SMTP.MAIL(mail_conn, ‘sender@localhost’);
UTL_SMTP.RCPT(mail_conn, ‘recipient@localhost’);
UTL_SMTP.DATA(mail_conn, msg_body);
UTL_SMTP.QUIT(mail_conn);
— Abort the statement
DBMS_RESUMABLE.ABORT(cur_sid);

ELSE
— Set timeout to 8 hours
DBMS_RESUMABLE.SET_TIMEOUT(28800);
END IF;
/* commit autonomous transaction */
COMMIT;
END;

septiembre 17, 2009 Posted by | Database, Oracle | Deja un comentario

TABLAS EXTERNAS Oracle 10G

Tablas Externas

Sabias que oracle tiene la forma de manejar archivos que están en el filesystem, fuera de la base de datos, como si fueran tablas normales de oracle. Si, puedes tener un archivo de texto y puedes leerlo con un SELECT, o pudes copiarlos a la base del datos con un INSERT … SELECT. También puedes hacer lo inverso, bajar datos de la base de datos a un archivo de texto.

Manejando Tablas Externa

La base de dato oracle permite acceso de read-only a data en tablas externas. Las tablas externas son definidas como tablas que residen en la base de datos, y pueden estar en cualquier formato para el cual es provista por un manejador de acceso.

Proveyendo la base de datos con metadata describiendo una tabla externa, la base de datos es capaz de exponer la data en tabla externa como si esta fueran data residiendo en una tabla regular de la base de datos. La data externa puede ser buscada directamente y en paralelo usando SQL.

Puedes, por ejemplo, select, join or sort data de tabla externa. También puedes crear vistas y sinónimos. Sin embargo, no se puede ejecutar operación DML (UPDATE,INSERT, o DELETE), y no se pude crear índices sobre tablas externas.

La base de datos Oracle provee dos forma de acceso a las tablas externas. El acceso por defecto es ORACLE_LOADER, el cual permite la lectura de la data de archivos externos usando la tecnologia de oracle loader. El manejador ORACLE_LOADER provee un mapeo de la data los cuales son un sub juego del archivo de control del utilitario SQL*Loader.

El segundo manejador, ORACLE_DATAPUMP, permite descargar data, que es, leer data desde la base de datos e insertarla en una tabla externa, representado por uno o mas archivos externos.

Las tablas externas de Oracle proveen un invaluable significado para ejecutar operaciones basicas de extracion, transformacion y cargado (ETL) que son muy comunes para data warehouse.

EXAMPLE: Creando una tabla externa y cargando data.

The file empxt1.dat contains the following sample data:

360,Jane,Janus,ST_CLERK,121,17-MAY-2001,3000,0,50,jjanus
361,Mark,Jasper,SA_REP,145,17-MAY-2001,8000,.1,80,mjasper
362,Brenda,Starr,AD_ASST,200,17-MAY-2001,5500,0,10,bstarr
363,Alex,Alda,AC_MGR,145,17-MAY-2001,9000,.15,80,aalda

The file empxt2.dat contains the following sample data:
401,Jesse,Cromwell,HR_REP,203,17-MAY-2001,7000,0,40,jcromwel
402,Abby,Applegate,IT_PROG,103,17-MAY-2001,9000,.2,60,aapplega
403,Carol,Cousins,AD_VP,100,17-MAY-2001,27000,.3,90,ccousins
404,John,Richardson,AC_ACCOUNT,205,17-MAY-2001,5000,0,110,jrichard

The following hypothetical SQL statements create an external table in the hr schema
named admin_ext_employees and load its data into the hr.employees table.

CONNECT / AS SYSDBA;

— Set up directories and grant access to hr
CREATE OR REPLACE DIRECTORY admin_dat_dir AS ‘/flatfiles/data’;
CREATE OR REPLACE DIRECTORY admin_log_dir AS ‘/flatfiles/log’;
CREATE OR REPLACE DIRECTORY admin_bad_dir AS ‘/flatfiles/bad’;
GRANT READ ON DIRECTORY admin_dat_dir TO hr;
GRANT WRITE ON DIRECTORY admin_log_dir TO hr;
GRANT WRITE ON DIRECTORY admin_bad_dir TO hr;
— hr connects
CONNECT hr/hr
— create the external table

CREATE TABLE admin_ext_employees
(employee_id NUMBER(4),
first_name VARCHAR2(20),
last_name VARCHAR2(25),
job_id VARCHAR2(10),
manager_id NUMBER(4),
hire_date DATE,
salary NUMBER(8,2),
commission_pct NUMBER(2,2),
department_id NUMBER(4),
email VARCHAR2(25)
)
ORGANIZATION EXTERNAL
(TYPE ORACLE_LOADER DEFAULT DIRECTORY admin_dat_dir ACCESS PARAMETERS
(
records delimited by newline
badfile admin_bad_dir:’empxt%a_%p.bad’
logfile admin_log_dir:’empxt%a_%p.log’
fields terminated by ‘,’
missing field values are null
(employee_id, first_name, last_name, job_id, manager_id,hire_date char date_format date mask «dd-mon-yyyy»,salary, commission_pct, department_id, email)
)
LOCATION (‘empxt1.dat’, ‘empxt2.dat’)
)
PARALLEL
REJECT LIMIT UNLIMITED;

— enable parallel for loading (good if lots of data to load)
ALTER SESSION ENABLE PARALLEL DML;

— load the data in hr employees table
INSERT INTO employees (employee_id, first_name, last_name, job_id, manager_id,hire_date, salary, commission_pct, department_id, email)
SELECT * FROM admin_ext_employees;

septiembre 16, 2009 Posted by | Database | 1 comentario

Manejo de tablas grandes en Oracle 10g (Ultima parte)

MANEJO DE PARTICIONES

Borrando Particiones

Se puede borrar particiones de range, list, o composite range-list de tablas particionadas. Para las tipos hash-partition o hash- subpartitions de range-hash tablas particionada, debes ejecutar coalesce envés de drop partition.

■ ALTER TABLE … DROP PARTITION para borrar una partición de una table
■ ALTER TABLE … DROP SUBPARTITION para borrar una sub partición de un range-list tablas particionadas.

Si desean preservar la data en la partición, usar la sentencia MERGE PARTITION envés de DROP PARTITION.

Si hay índices locales definidos en la tabla, esta sentencia también borran las particiones y sub particiones de un índice local. Todos los índices globales, o todas las particiones de los índices globales, son marcados como UNUSUABLE a menos que lo siguiente sea verdad:

• Si especificaste UPDATE INDEXES o UPDATE GLOBAL INDEXES

• Las particiones o sub particiones a ser borradas estén vacías

Borrando particiones de índices

No se puede borrar explícitamente una partición de un índice local, las particiones de los índices locales son borradas solamente cuando se borra la partición de la tabla.

Si la partición de un índice global esta vacio, puedes borrar explícitamente una partición de un índice usando ALTER INDEX …. DROP PARTITION, pero si la partición del índice global contiene data, borrando la partición causa que la partición de mayor nivel sea marcada como UNUSUABLE.

Exchanging Particiones

Se utiliza para convertir una partición o sub partición en una tabla no particionada, y una tabla no particionada en una tabla particionada o sub partición de una tabla particionada intercambiando sus segmentos de datos. También puedes convertir una tabla particionada tipo hash-partitioned en una partición de una tabla particionada tipo range-hash partitioned, o convertir la partición de la range-hash en hash-partition. Similarmente, puedes convertir una tabla particionada tipo list-partition en una tablaparticionada tipo range-list partitioned, o convertir las particiones del range-list partitioned en list-partitioned.

Exchanging particiones de tablas es mas útil cuando tienes una aplicación usando tablas no particionadas que quieres convertirla a particionada.

ALTER TABLE stocks
EXCHANGE PARTITION p3 WITH TABLE stock_table_3;

Los índices son marcados como UNUSUABLE, a menos que se ejecute la opción de UPDATE INDEX o UPDATE GLOBAL INDEX. Solamente en la tabla tipo INDEX-ORGANIZED los índices GLOBALES son mantenidos en estado USABLE.


Merging Particiones

Para unir el contenido de dos particiones en una partición. Las dos particiones originales son borradas.

— Create a Table with four partitions each on its own tablespace
— Partitioned by range on the data column.

CREATE TABLE four_seasons
(
one DATE,
two VARCHAR2(60),
three NUMBER
)
PARTITION BY RANGE ( one )
(
PARTITION quarter_one
VALUES LESS THAN ( TO_DATE(’01-apr-1998′,’dd-mon-yyyy’))
TABLESPACE quarter_one,
PARTITION quarter_two
VALUES LESS THAN ( TO_DATE(’01-jul-1998′,’dd-mon-yyyy’))
TABLESPACE quarter_two,
PARTITION quarter_three
VALUES LESS THAN ( TO_DATE(’01-oct-1998′,’dd-mon-yyyy’))
TABLESPACE quarter_three,
PARTITION quarter_four
VALUES LESS THAN ( TO_DATE(’01-jan-1999′,’dd-mon-yyyy’))
TABLESPACE quarter_four
);

— Create local PREFIXED index on Four_Seasons
— Prefixed because the leftmost columns of the index match the
— Partition key

CREATE INDEX i_four_seasons_l ON four_seasons ( one,two )
LOCAL (
PARTITION i_quarter_one TABLESPACE i_quarter_one,
PARTITION i_quarter_two TABLESPACE i_quarter_two,
PARTITION i_quarter_three TABLESPACE i_quarter_three,
PARTITION i_quarter_four TABLESPACE i_quarter_four
);

— Merge the first two partitions

ALTER TABLE four_seasons
MERGE PARTITIONS quarter_one, quarter_two INTO PARTITION quarter_two
UPDATE INDEXES;

Si omites la clausula UPDATE INDEXES de la sentecia ALTER TABLE … MERGE PARTITION …, tienes entonces que reconstruir el indice local de la particion afectada.

— Reconstruir el indice de quarter_two, el cual ha sido marcado unusable porque este no tiene toda la data del Q1 en esta.

Para reconstruir todos los indices UNUSABLE ejecutar la siguiente sentencia:

ALTER TABLE four_seasons MODIFY PARTITION quarter_two REBUILD UNUSABLE LOCAL INDEXES;

Splitting Particiones

Spliting es utilizado para redistribuir el contenido de una partición en dos nuevas particiones. Esto resulta útil cuando una partición se hace muy grande y causa que el backup, la recuperación o el mantenimiento se tomen mucho tiempo para completar. También puede ser usado para redistribuir la carga de I/O.

No puede ser usada en hash partition o subpartition.

ALTER TABLE vet_cats SPLIT PARTITION
fee_katy at (100) INTO ( PARTITION
fee_katy1 …, PARTITION fee_katy2 …);
ALTER INDEX JAF1 REBUILD PARTITION fee_katy1;
ALTER INDEX JAF1 REBUILD PARTITION fee_katy2;
ALTER INDEX VET REBUILD PARTITION vet_parta;
ALTER INDEX VET REBUILD PARTITION vet_partb;

Todos los índices particionados LOCALES y GLOBALES son puestos en estado UNUSABLE, solo los índices GLOBALES de Index-Organized table se mantienen USABLE.

Otros tipos de manejo de particiones son:

TRUNCATE PARTITION

Se utiliza para borrar toda la data de una partición, es igual a borrar la partición solo que el trúncate deja la estructura lógica.

MOVE PARTITION

Se utiliza para mover la partición de un tablespace a otro, rejuntar la data y reducir la fragmentación, y otras más.

RENAME PARTITION

Se utiliza para cambiar el nombre a una partición.

septiembre 15, 2009 Posted by | Database | 2 comentarios

Manejo de tablas grandes en Oracle (Continuacion)

MANEJO DE PARTICIONES Oracle 10G

Continuando mi último artículo sobre el uso de las particiones de oracle, los tipos de particiones y su uso. En este artículo haremos referencia a varias funcionalidades que pueden resultar útiles en determinado momento en la definición de una tabla particionada.

Compresión de Tabla Particionada

Puedes comprimir alguna o todas las particiones usando la compresión de tablas. Este atributo puede ser declarado para un tablespace, una tabla o una partición de una tabla. Donde quiera que el atributo de compresión no sea especificado, este es heredado igual que cualquier otro atributo de almacenamiento.

El siguiente ejemplo crea una tabla particionada con una partición comprimida “costs_old”. EL atributo de compresión para la tabla y todas las otras particiones es heredada del tablespace.

CREATE TABLE costs_demo (
prod_id NUMBER(6), time_id DATE,
unit_cost NUMBER(10,2), unit_price NUMBER(10,2))
PARTITION BY RANGE (time_id)
(PARTITION costs_old
VALUES LESS THAN (TO_DATE(’01-JAN-2003′, ‘DD-MON-YYYY’)) COMPRESS,
PARTITION costs_q1_2003
VALUES LESS THAN (TO_DATE(’01-APR-2003′, ‘DD-MON-YYYY’)),
PARTITION costs_q2_2003
VALUES LESS THAN (TO_DATE(’01-JUN-2003′, ‘DD-MON-YYYY’)),
PARTITION costs_recent VALUES LESS THAN (MAXVALUE));

Llave de compresión con índices particionados

Se pude comprimir alguna o todas las particiones de un índice B-tree usando una llave de compresión. La llave de compresión es aplicable solo a un índice B-tree. Los índices bitmap son almacenados en una manera comprimida por defecto.

El siguiente ejemplo nos presenta un índice local particionado con todas las particiones excepto la más reciente.

CREATE INDEX i_cost1 ON costs_demo (prod_id) COMPRESS LOCAL
(PARTITION costs_old, PARTITION costs_q1_2003,
PARTITION costs_q2_2003, PARTITION costs_recent NOCOMPRESS);
Ventajas y desventajas de compression

El objetivo de la compresión es reducir el uso de espacio en disco y uso de memoria (especialmente, el buffer cache), puedes almacenar tablas y tablas particionadas en un formato comprimido en una base de datos oracle. Esto es muy utilizado para operaciones de read-only. La compresión de tablas puede también ser utilizado para agilizar ejecuciones de búsquedas. Sin embargo hay un alto costo de sobrecarga del CPU.

Mantenimiento de tablas particionadas

En esta parte presentamos las operaciones de mantenimiento de tablas particionadas. Donde la usabilidad de índices o índices particionados son afectados por las operaciones de mantenimiento, se debe considerar lo siguiente:

Solamente índices o índices particionados que no están vacías son candidatos para ser marcado UNUSUABLE. Si ellas están vacías, el estatus USABLE/UNUSABLE queda incambiable.

Solamente índices o índices particionados con el estado USABLE son actualizados por los subsecuentes DML.

Actualizando índices automáticamente

Antes de discutir las operaciones de mantenimiento para tablas particionadas e índices. Es importante discutir y entender los efectos de UPDATE INDEXES que puede ser especificado en la sentencia ALTER TABLE.

Por defecto muchas operaciones de tablas o tablas particionadas invalidan (marcan UNUABLE) los correspondientes índices o índices particionados. Tú debes reconstruir el índice completo o, en el caso de índices globales, cada uno de sus particiones. La base de datos te deja sobre escribir este comportamiento por defecto si especificas UPDATE INDEXES en su sentencia ALTER TABLE para las operaciones de mantenimiento. Especificando esta clausula les dice a la base de datos que actualice el índice al momento que ejecute la operación de mantenimiento DDL.

Esto provee los siguientes beneficios:

El índice es actualizado en conjunto con la operación basado en tabla. Con esto no es requerido reconstruir el índice.

El índice está altamente disponible porque este no consigue el estatus de UNUSUABLE. El índice se mantiene disponible aun mientras la operación DDL se está ejecutando y este puede ser usado para accesar las particiones de la tabla no afectada.

No tienes que buscar todos los índices inválidos para ser reconstruidos

Consideraciones cuando Actualizas Indices automáticamente.

Las siguientes implicaciones son valederas cuando se especifica UPDATE INDEXES.

La sentencia DDL en las particiones toman mas tiempos para ejecutar, porque indices que eran anteriormente marcado como UNUSUABLE son actualizado. Sin embargo, debes comparar este incremento con el tiempo que este toma para ejecutar DDL sin UPDATE INDEXE si el tamaño de la partición es menos que el 5% del tamaño de la tabla.

Las operaciones de DROP, TRUNCATE y EXCHANGE no son operaciones rápidas cuando utiliza UPDATE INDEX. Debes comparar el tiempo que toma hacer un DDL y hacer la reconstrucción de los índices.

Cuando actualiza la tabla con índices globales:

– El índice es actualizado en parte. La actualizaciones del índice son logged, y redo y se generan registros de undo, si se reconstruye un índice global completo puedes hacerlo usando el modo de NOLOGGING.

– Reconstruyendo el índice complete manualmente se crea uno mas eficiente, porque es mas compacto con mejor utilización de los espacios.

Añadir Particiones

Para añadir una nueva partición a una tabla particionada debes utilizar la sentencia ALTER TABLE …. ADD PARTITION; siempre que añada una nueva partición esta debe ser el valor mas alto de la partición. Para añadir una partición al principio o en el medio debes utilizar la clausula SPLIT PARTITION.

ALTER TABLE sales
ADD PARTITION jan96 VALUES LESS THAN ( ’01-FEB-1999′ )
TABLESPACE tsx;

Los índices locales y globales son mantenidos en estado USABLE; si es un RANGE-PARTITION. Para el HASH-PARTITION el índice pueden ser convertidos en UNSUABLE.

Para HASH-PARTITION:

Tablas tipo: HEAP(Regular), los índices locales para las nuevas partición y para las particiones existentes cuyos registros fueron redistribuidos son marcados como UNSUABLE y tienen que ser reconstruidos.

Para los índices globales todos los índices son puestos en estado de UNSUABLE y tienen que ser reconstruidos.

Nota: A menos que se utilice ALTER TABLE … UPDATE INDEX

Tablas tipo: Indexed-organized, los índices locales tienen el mismo efecto que el tipo HEAP o regular.

Para los índices globales los índices se mantienen USABLE.

Coalescing Partitions

Coalescing es la forma de reducir la cantidad de particiones en una tabla HASH-PARTITION o índice, o el numero de sub particiones en una tabla tipo RANGE-HASH. Cuando una hash-partition es coalescing, sus contenidos son redistribuidos entre uno o mas particiones restantes determinado por la función HASH.

ALTER TABLE ouu1 COALESCE PARTITION;

Los índices particionados pueden ser macados en estado de UNUSUABLE.

Tablas tipo: HEAP(Regular), los índices locales correspondientes a la partición seleccionada son borrados, los índices particionados correspondientes a una o mas particiones absorbidas son marcados UNUSUABLE y tienen que ser reconstruidos.

Para los índices globales todos los índices son puestos en estado de UNSUABLE y tienen que ser reconstruidos.

Tablas tipo: Indexed-organized, los indices locales tienen el mismo efecto que el tipo HEAP o regular.

Para los índices globales los índices se mantienen USABLE.

(Continuara …)

septiembre 14, 2009 Posted by | Database, Oracle, Tecnologia | Deja un comentario

SQL tunning

SQL Tunning (optimización)

El objetivo de tunning es optimizar las sentencias SQL para un mejor plan de ejecución y evitar la utilización innecesaria de memoria y CPU.

El motor de Oracle tiene dos modos de operación, basado en costo (COST) o regla (RULE).

Reglas: Esta es la primera y más vieja forma de optimización. Bajo la optimización de regla Oracle busca a través del diccionario de datos la forma de determinar la forma más efectiva para realizar una búsqueda de una sentencia SQL.

Costo: La ejecución de una sentencia se basa en estadísticas, es necesario que las tablas estén analizadas lo mas reciente posible para obtener el mejor resultado. En este modo el parse o tren de ejecución es totalmente controlado por el motor de Oracle basado en las estadísticas generadas por el ANALYZE. La única forma de alterarlo es utilizando los HINTS.

Podemos examinar el comportamiento de una sentencia SQL analizando su plan de ejecución:

·         con la sentencia EXPLAIN PLAN

·         con trazas TRACE

Para optimizar las sentencias SQL podemos:

·         Crear índices adecuados y fomentar su uso (CREATE INDEX).

·         Aplicar HINTS para modificar o influenciar las decisiones del optimizador (COST).

·         Actualizar estadísticas periódicamente (ANALYZE). (COST)

·         Cuidar la programación.

En particular debemos prestar atención las sentencias SELECT que son más dadas a la complejidad.

 

Indices

 Respecto a los índices debemos tener en cuenta:

·         Crear índices sobre columnas lo más selectivas posibles (aquellas que reducen al máximo el espacio de búsqueda). Para determinar la selectividad de una columna debemos basarnos en el tipo de información que tiene la columna, mientras más información distinta hayan más selectiva es la misma.

·         En el caso de los índices compuestos, el orden en el que se declaran estas columnas deberá ser de la más selectiva a la menos selectiva (siempre que sea posible).

Programación

Respecto a la programación:

·         Limitar los accesos a tablas remotas.

·         Utilizar la cláusula UNION ALL en lugar de UNION siempre que sea posible.

·         Evitar el uso de llamadas a funciones PL/SQL en sentencias SQL.

·         En cambio para determinados problemas, puede ser útil el uso de procedimientos o funciones PL/SQL almacenados en la base de datos en lugar de una sentencia SQL (con un cursor p.ej.).

·         Considerar que hay distintas opciones para obtener el mismo resultado.

·         El orden de las tablas en el Join puede ser importante.

·         Se deben optimizar tambien las subconsultas.

·         Considerar en algunos casos alternativas al Join (consultas anidadas, cláusula exists subconsulta , outer-join etc…).

·         Revisar las consultas periódicamente, pueden no ser ya optimas debido al constante cambio en el tamaño de las tablas, la distribución de los valores, el esquema etc….

·         Gestión de las sentencias SQL que contienen vistas. Si una consulta contiene una vista, el optimizador tiene dos formas de actuar: resolver primero la vista y después la consulta o integrar la vista en el texto de la misma. Si se resuelve primero la vista, el resultado completo de la vista se determina en primer lugar y, el resto de las condiciones de la consulta se aplican como filtro. Dependiendo del tamaño de las tablas involucradas puede resultar conveniente hacerlo de un modo u otro. Debemos tener en cuenta que, si una vista contiene una operación de conjunto (GROUP BY, SUM, COUNT o DISTINCT), no podrá ser integrada en la consulta.

·         Considerar el uso de las bind variables: Las sentencias pueden recoger los parámetros por valor (where salario>1000) o una vez compilada la sentencia haciendo uso de Bind Variables (where salario>:b1). La ventaja de la segunda opción es que Oracle compila una única vez la sentencia y reutiliza el código compilado para cada uno de los valores para los parámetros. En este segundo caso, Oracle no puede calcular el grado de selectividad de una consulta y, en su lugar, aplica un grado de selectividad por defecto (asociado a cada tipo de operación), lo cual puede dar lugar a decisiones «equivocadas». Por lo tanto, trabajando por costes es desaconsejable el uso de Bind Variables, salvo que trabajemos con sentencias que se van a ejecutar repetidas veces y que no ofrezcan muchas dudas en cuanto a los posibles planes de acceso que puede generar.

abril 23, 2009 Posted by | Database, Oracle, Tecnologia | Deja un comentario

Microsoft .NET tools Best Practices

Microsoft cuenta con unas series de herramientas muy útiles para analizar las aplicaciones hechas en .NET. Aquí os dejo para que los que les interesen hagan el mejor uso de ellas.

Best Practice Analyzer for ASP.NET

Overview

The Best Practice Analyzer ASP.NET (alpha release) is a tool that scans the configuration of an ASP.NET 2.0 application. The tool can scan against three mainline scenarios (hosted environment, production environment, or development environment) and identify problematic configuration settings in the machine.config or web.config files associated with your ASP.NET application. This is an alpha release intended to gain feedback on the tool and the configuration rules included with it.

http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=d2717206-e804-415e-9173-c7b7327289e4#Overview

 

Microsoft Code Analysis Tool .NET (CAT.NET) v1 CTP – 32 bit

Overview

CAT.NET is a snap-in to the Visual Studio IDE that helps you identify security flaws within a managed code (C#, Visual Basic .NET, J#) application you are developing. It does so by scanning the binary and/or assembly of the application, and tracing the data flow among its statements, methods, and assemblies. This includes indirect data types such as property assignments and instance tainting operations. The engine works by reading the target assembly and all reference assemblies used in the application — module-by-module — and then analyzing all of the methods contained within each. It finally displays the issues its finds in a list that you can use to jump directly to the places in your application’s source code where those issues were found. The following rules are currently support by this version of the tool. – Cross Site Scripting – SQL Injection – Process Command Injection – File Canonicalization – Exception Information – LDAP Injection – XPATH Injection – Redirection to User Controlled Site

http://www.microsoft.com/downloads/details.aspx?familyid=0178E2EF-9DA8-445E-9348-C93F24CC9F9D&displaylang=en

Microsoft Anti-Cross Site Scripting Library V3.0 Beta

Overview

The Microsoft Anti-Cross Site Scripting Library V3.0 (Anti-XSS V3.0) is an encoding library designed to help developers protect their ASP.NET web-based applications from XSS attacks. It differs from most encoding libraries in that it uses the white-listing technique — sometimes referred to as the principle of inclusions — to provide protection against XSS attacks. This approach works by first defining a valid or allowable set of characters, and encodes anything outside this set (invalid characters or potential attacks). The white-listing approach provides several advantages over other encoding schemes. New features in this version of the Microsoft Anti-Cross Site Scripting Library include: – An expanded white list that supports more languages – Performance improvements – Performance data sheets (in the online help) – Support for Shift_JIS encoding for mobile browsers – A sample application – Security Runtime Engine (SRE) HTTP module

http://www.microsoft.com/downloads/details.aspx?familyid=051EE83C-5CCF-48ED-8463-02F56A6BFC09&displaylang=en

 

Microsoft FxCop 1.36

FxCop is a code analysis tool that checks .NET managed code assemblies for conformance to the Microsoft .NET Framework Design Guidelines. It uses MSIL parsing, and callgraph analysis to inspect assemblies for more than 200 defects in the following areas:

Library design
Globalization
Naming conventions
Performance
Interoperability and portability
Security
Usage

FxCop includes both GUI and command line versions of the tool and supports analyzing .NET 1.x, .NET 2.0 and .NET 3.x components.

This version provides support for .NET 3.5 SP1.

 

http://www.microsoft.com/downloads/details.aspx?familyid=9AEAA970-F281-4FB0-ABA1-D59D7ED09772&displaylang=en

ASP.NET MVC 1.0

Overview

ASP.NET MVC 1.0 provides a new Model-View-Controller (MVC) framework on top of the existing ASP.NET 3.5 runtime. This means that developers can take advantage of the MVC design patterns to create their Web Applications which includes the ability to achieve and maintain a clear separation of concerns (the UI or view from the business and application logic and backend data), as well as facilitate test driven development (TDD). The ASP.NET MVC framework defines a specific pattern to the Web Application folder structure and provides a controller base-class to handle and process requests for “actions”. Developers can take advantage of the specific Visual Studio 2008 MVC templates within this release to create their Web applications, which includes the ability to select a specific Unit Test structure to accompany their Web Application development.

The MVC framework is fully extensible at all points, allowing developers to create sophisticated structures that meet their needs, including for example Dependency Injection (DI) techniques, new view rendering engines or specialized controllers.

As the ASP.NET MVC framework is built on ASP.NET 3.5, developers can take advantage of many existing ASP.NET 3.5 features, such as localization, authorization, Profile etc.n

 

http://www.microsoft.com/downloads/details.aspx?familyid=53289097-73CE-43BF-B6A6-35E00103CB4B&displaylang=en

Microsoft Source Code Analyzer for SQL Injection

Overview

In response to the recent mass SQL injection attacks, Microsoft has developed a new static code analysis tool for finding SQL Injection vulnerabilities in ASP code. Web developers can run the tool on their ASP source code to identify the root cause of the attack and address them to reduce their exposure to future attacks. The tool will scan ASP source code and generate warnings related to first order and second order SQL Injection vulnerabilities. The tool also provides annotation support that can be used to improve the analysis of the code.

http://www.microsoft.com/downloads/details.aspx?familyid=58A7C46E-A599-4FCB-9AB4-A4334146B6BA&displaylang=en

 

Improving Web Application Security: Threats and Countermeasures

Overview

This download contains guidelines for architecting, designing, building, reviewing, and configuring secure to build hack resilient ASP.NET Web applications across the application tiers, technology, and servers. Topics include Threats and Countermeasures; Threat Modeling; security review for architecture, design, code and deployment; Hosting web applications; CAS; securing web, application and database servers; ASP.NET, Enterprise Services (COM+), Web Services, Remoting, and data access (including ADO.NET and SQL Server).

 

http://www.microsoft.com/downloads/details.aspx?familyid=E9C4BFAA-AF88-4AA5-88D4-0DEA898C31B9&displaylang=en

 

abril 13, 2009 Posted by | Microsoft, Tecnologia | Deja un comentario

Oracle Data Provider for .NET Best Practices

Applies to:

Oracle Data Provider for .NET – Version: 9.2.0.1.0 to 11.1.0.7.0
Microsoft Windows 2000
Microsoft Windows XP (64-bit Itanium)
Microsoft Windows Server 2003 (64-bit Itanium)
Microsoft Windows XP (64-bit AMD64 and Intel EM64T)
Microsoft Windows Server 2003 (64-bit AMD64 and Intel EM64T)
Microsoft Windows (64-bit) on Intel Itanium
Microsoft Windows Vista (32-bit)
Microsoft Windows Server 2003 R2 (64-bit AMD64 and Intel EM64T)
Microsoft Windows Server 2003 R2 (32-bit)
Microsoft Windows Vista x64 (64-bit)
Microsoft Windows Server 2008 (32-bit)
Microsoft Windows Server 2008 (64-bit Itanium)
Microsoft Windows Server 2008 x64 (AMD64/EM64T)
Microsoft Windows (32-bit)
Microsoft Visual Studio .Net 2003
Microsoft Visual Studio .Net 2005
Microsoft Visual Studio .Net 2008
.Net Framework 1.1
.Net Framework 2.0
.Net Framework 3.0

Purpose

Best Practices for getting the best performance and results from the Oracle Data Provider for .Net. It covers the following sections:

Connections and Connection Pooling

Command Objects – SQL Performance

Garbage Collector (GC) and Disposing

Miscellaneous Other Tips

Scope and Application

This is intended advanced programmers with expertise in Microsoft Visual Studio programming.

Oracle Data Provider for .Net Best Practices

Oracle ODP .Net Performance Best Practices

1. Connections and Connection Pooling

The following two connection pool parameters are available for configuring the size of the middle-tier ODP pool within your application pool.

Min pool size

Max pool size

It is recommended that you set the min pool size to the number of connections that represents your average work load or concurrent connections to ensure there are connections available for the application when requested. Connections are cheap and it is preferred to overestimate the min pool size then incur the overhead associated with physically creating new connections. Max pool size should be the maximum peak or maximum amount of concurrent connections to be serviced. Connections should always remain at a steady state once the application has ramped up to capacity. You want to avoid any overhead associated with creating and destroying a large number of connections.

The following two connection pool parameters are available for configuring how the ODP connection pooling facility will dynamically grow and shrink the pool.

Incr pool size

Decr pool size

The Incr and Decr pool size should be set to a value that will allow a gradual increase or decrease of connections to and from steady state as your application ramps up to capacity. These values should not be set too high as it will result in creating or destroying a large number of connections at a single point in time. The dynamic growth and shrinking of the pool occurs every three minutes. A worker thread will use an LRU algorithm to determine which connections are candidates for removal. The pool size is decreased by the number of candidates up to decr pool size that will not violate the min pool size setting.

Other Additional Information Regarding Pooling:

Connection pools are not shared across worker processes.

A pool is created based on a unique connection string property value. Be careful when dynamically creating connection pool property strings. Changing the order will not result in a new pool but modifying any of the values will result in another connection pool being created and used by your application.

The method Clear Pool should only be used when the pool appears to have become unstable. Handling ora-3113 exceptions would be a scenario where it would be appropriate to re-create the pool as this is an indication that connections in the pool have become stale due to events such as database down/maintenance.

Due to the nature of connection pooling, some connections can remain idle which will cause can cause a firewall that is set to kill idle connections to sever some connections in the pool. To help reduce possible sqlnet connection errors (ie. ORA-3135, ORA-3113, ORA-1012) «Validate Connection=true» CAN BE SET when using ODP connection pooling. This will validate connections coming out of the pool by causing a round trip to the server to validate the connection which will help to reduce passing a stale connection to the application. This does cause some performance penalty as a round trip occurs for every con.open call.

Due to the use of both managed and unmanaged resources by odp, it is very important that you always close and dispose resources. Not properly disposing connections, ref cursors, lobs, etc may result in leaking connections in the pool which can lead to poor application performance, and exceptions such as «ODP-1000 «Connection Request Timed Out», “ORA-1000 Max Open Cursors Exceeded”, and memory leaks among other things. Please refer to the Garbage Collection section below for additional information. Other possible causes for ODP-1000 Exceptions are detailed in Technical Note 363026.1 ODP-1000 «Connection Request Timed Out» explained.

While the default values are generally adequate, the pool is highly configurable and determining optimal settings requires an understanding of the application usage, and may vary on a case by case basis. As of 11.1.0.6 ODP.NET, there are built in performance counters that can be used to help gauge the activity. More information on the ODP.NET performance counters please see the Oracle Data Provider for .Net Developer’s Guide, «Connection Pool Performance Counters» page 3-7.

The name-value pairs for the pooling attributes are case insensitive, with the exception of Username and Password if case sensitivity is preserved by code. Refer to the ODP documentation under in the OracleConnection Class section for a complete example that demonstrates when connection pools are created and when connections are drawn from an existing connection pool.

For more on the Connection Pooling settings please see Note 240997.1 Using Connection Pooling with ODP.Net.

2. Command Objects – SQL Performance

It is highly recommended that you use bind variables with your SQL and PLSQL statements/calls. This technique will allow the Oracle Server to re-use parsed statements only replacing the placeholders for the binds with the new values for execution. This best practice will help you void heavy contention on the shared pool and improve SQL response times as the statement will only incur a soft parse when executing the same statement again within your application.

In addition to using Bind Variables so that server resources are utilized more efficiently, ODP.NET uses Statement Caching so that the statement handles on the client side can be re-used. Statement Caching is on by default, and the Statement Cache Size defaults to 10, which can be tuned based on application usage. Increasing this value can improve performance, at the cost of increased memory usage.
The cache is maintained via a LRU algorithm, so in a case where a few statements are executed heavily and a large number of statements are executed infrequently, it may be beneficial to explicitly choose which statements are added to the cache. For example, you can set the cache size to 10 in the connection pool, then execute each of the Top 10 statements once. From then on, set AddStatementToCache to false for all remaining calls.

3. Garbage Collector (GC) and Disposing

It is very highly recommended that all the Oracle objects that have a close and dispose method be called as soon as they are done being used in the application. Dispose should be called explicitly in the application code, rather than relying on finalizes to do the cleanup. To ensure that Dispose is called under all circumstances, it should be done in a Finally block, or via the C# Using construct.

Oracle Support can not stress this enough. Since we have seen many issues occur, just because of the objects not being cleaned up in a timely manner. Here are reasons why to call the close/dispose methods on the Oracle objects:

ODP uses both managed and unmanaged code. Unmanaged code requires explicit cleanup, ie. Calling dispose. Which means not all the objects will be cleaned up by the gc, if dispose is not used.

ORA-1000 errors occur when objects are not close/disposed of correctly and in a timely manner. See Note 286707.1 Ora-01000 received in ODP.NET application using OracleDataReader for more information.

By waiting on the gc to try to clean up the objects it can, may cause the application to appear to have a memory leak or excessive memory usage. Instead use the close/dispose methods to free the memory at the appropriate time once the object is done being used. Instead of waiting on the gc.

Application can be slowed down when waiting on the gc to do a large amount of close/disposes at one time. By closing/disposing of the objects when they are finished being used will increase the speed of the application.

Applications may hang or crash due to the memory not being freed when objects are finished with them. By not calling close/dispose on the Oracle objects, the objects can build up used memory and reduce the available memory for the application to run effectively.

i. How to determine if close and or dispose is being called on the Oracle Object:

To help determine if the close and / or dispose methods are being called, turn on ODP tracing. For instructions on how to turn on odp tracing please see Note 216912.1. Then run the application for 5 – 10 minutes. This will give a good baseline to start the troubleshooting. Please note that ODP tracing does not trace every Oracle object. See chart below for details on which calls are traced. 

Once the trace files have been generated, parse them for each of the class method calls listed below in the Table 1. In the trace file it will show the class.method calls in the following format. 

Open/Close/Dispose of connections can be seen in the traces as follows:

This shows the opening of the connection:

(ENTRY) OracleConnection::Open()

This shows the closing of the connection:

(ENTRY) OracleConnection::Close()

This shows the disposing of the connection:

(ENTRY) OracleConnection::Dispose() 

 Here is a list of Oracle classes that have either a close and / or dispose method that need to be called once that class is done being used and if the information is contained in the ODP trace:

Table 1

Class

Close Method

Dispose Method

Traced In ODP

OracleConnection

Yes

Yes

Yes

OracleDataReader

Yes

Yes

No, Dispose not traced.

OracleBFile

Yes

Yes

No, Dispose not traced.

OracleBlob

Yes

Yes

No, Dispose not traced.

OracleClob

Yes

Yes

No, Dispose not traced.

OracleXmlStream

Yes

Yes

No, Dispose not traced.

OracleCommand

 

Yes

No, Dispose not traced.

OracleDataAdapter

 

Yes

No, Dispose not traced.

OracleRefCursor

 

Yes

No, Dispose not traced.

OracleParameter

 

Yes

Yes

OracleCommandBuilder

 

Yes

Yes

OracleTransaction

 

Yes

Yes

OracleXmlType

 

Yes

No, Dispose not traced.

OracleGlobalization

 

Yes

Yes

NOTE: As you can see that not all methods are traced. Unpublished Enhancement Request Bug 5035642 has been filed to provide more comprehensive ODP.Net Tracing. However, the listing above should help to analyze the trace files and identify which methods are not being called. Which will help with identifying which coding changes are needed to properly close and / or dispose of the Oracle objects.

4. Miscellaneous Other Tips

ThreadAborts should never be used in any application, including one that uses the Oracle Data Provider for .Net. This is stated in the Oracle Data Provider for .Net Release Notes:

Thread.Abort() should not be used as unmanaged resources may remain unreleased properly, which can potentially cause memory leaks and hangs. 

Typically, this would not be discovered until a problem occurs and a crash or hang dump of the application was taken. ThreadAbort may be call during Response.Redirect, Response.End, or Server.Transfer which is explained further at http://support.microsoft.com/kb/312629 or IIS times out the connection. For more assistance on troubleshooting why a ThreadAbort is being called, please contact Microsoft.

 

abril 13, 2009 Posted by | Microsoft, Tecnologia | 1 comentario

Oracle Tips; BULK COLLECT

Normalmente los programadores utilizan un cursor para extraer y procesar múltiples registros de datos, uno a la vez, pero hay problemas de performance cuando se esta lidiando con grandes cantidades de registros usando cursores. Como sabemos, un cursor entrega un registro a la vez, manteniendo una vista consistente, hasta que todos los registros hayan sido procesados o hasta que el cursor es cerrado.

Un problema de performance aparece por el hecho de que hay dos motores «engines» en la base de datos, el PL/SQL Engine y el SQL Engine. En algunas versiones de la base de datos, esos motores «engines» tienen diferentes comportamientos debido a alguna característica disponible en SQL pero no en PL/SQL. Cuando un cursor entrega un registro de datos este ejecuta a «Context Switch» al motor «engine» de SQL, y es el componente de SQL que extrae la data. El Motor de SQL aloja la data en memoria y otro «context switch» nos lo devuelve a PL/SQL.

El motor PL/SQL continúa procesando hasta que el próximo registro es requerido, y el proceso es repetido. El conext switch es muy rápido, pero si es ejecutado una y otra vez, contantemente, esto puede tomar notable cantidad de tiempo. Un BULK COLLECT es un método de entregar datos donde el motor de PL/SQL le dice al motor de SQL que colecte muchos registros de una sola vez y lo entregue en una sola colección. El motor de SQL retrae todo los registros, lo carga en una colección y lo devuelve al motor PL/SQL. Todos los registros son extraídos con solo 2 conetext switches. Mientras mas largo es el número de registros a procesar, más eficiencia es ganada cuando se usa BULK COLLECT.

declare

   type number_array is varray(10000) of number;

   type string_array is varray(10000) of varchar2(100);

   a_store string_array;

   a_qty   number_array;

   cursor c1 is

      select store_key, sum(quantity) from sales

      group by store_key;

      begin

      open c1;

         fetch c1 bulk collect into a_store, a_qty;

      close c1;

     for indx in a_store.first..a_store.last loop

       dbms_output.put_line(a_store(indx)||’….’||a_qty(indx));

     end loop;

  end; /

 

S102….21860

S105….13000

S109….12120

S101….2180

S106….6080

S103….7900

S104….13700

S107….24700

S108….5400

S110….3610

Si queremos mejorar el performace de un select, update o un delete de grandes cantidades de registros a procesar es buena idea utilizar el BULK COLLECT combinado con el FORALL.

Como utilizar el BULK COLLECT

(i)  Input collections, usar FORALL statement

(ii) Output collections, usar BULK COLLECT clause

 

(i) Input Collections

Input collections son datos pasados del motor PL/SQL al motor SQL al ejecutar INSERT, UPDATE y DELETE.

 

Sintaxis:

 

   FORALL index IN lower_bound..upper_bound

     sql_statement;

 

Ejemplo 1

———

 

In this example, 5000 part numbers and names are loaded into index-by

tables.  Then, all table elements are inserted into a database table

twice.  First, they are inserted using a FOR loop, which completes in

8 seconds.  Then, they are inserted using a FORALL statement, which

completes in only 0 seconds.

 

SQL> SET SERVEROUTPUT ON

SQL> CREATE TABLE parts (pnum NUMBER(4), pname CHAR(15));

   

DECLARE

  TYPE NumTab IS TABLE OF NUMBER(4) INDEX BY BINARY_INTEGER;

   TYPE NameTab IS TABLE OF CHAR(15) INDEX BY BINARY_INTEGER;

   pnums NumTab;

   pnames NameTab;

   t1 CHAR(5);

   t2 CHAR(5);

   t3 CHAR(5);

   PROCEDURE get_time(t OUT NUMBER) IS

   BEGIN SELECT TO_CHAR(SYSDATE,’SSSSS’) INTO t FROM dual; END;

BEGIN

   FOR j IN 1..5000 LOOP  — load index-by tables

      pnums(j) := j;

      pnames(j) := ‘Part No. ‘ || TO_CHAR(j);

   END LOOP;

   get_time(t1);

   FOR i IN 1..5000 LOOP — use FOR loop

      INSERT INTO parts VALUES (pnums(i), pnames(i));

   END LOOP;

   get_time(t2);

   FORALL i IN 1..5000  –use FORALL statement

      INSERT INTO parts VALUES (pnums(i), pnames(i));                         

   get_time(t3);

   DBMS_OUTPUT.PUT_LINE(‘Execution Time (secs)’);

   DBMS_OUTPUT.PUT_LINE(‘———————‘);

   DBMS_OUTPUT.PUT_LINE(‘FOR loop: ‘ || TO_CHAR(t2 – t1));

   DBMS_OUTPUT.PUT_LINE(‘FORALL:   ‘ || TO_CHAR(t3 – t2));

END;

/                                                                             

SQL> @bulk.sql

Execution Time (secs)

———————

FOR loop: 8

FORALL:   0

 

PL/SQL procedure successfully completed.              

 

Rollback Behavior

—————–

Si una sentencia FORALL falla, entonces los cambio en la base de datos son retornados a un savepoint implícito marcado antes de cada ejecución de la sentencia SQL.

(ii) Output Collections

Output collections son datos pasados del motor SQL al motor PL/SQL como resultado de una sentencia SELECT o FETCH.

 

 

Using the BULK COLLECT clause

—————————–

The keywords BULK COLLECT can be used with SELECT INTO, FETCH INTO,

and RETURNING INTO clauses.  The syntax is as follows:

 

   … BULK COLLECT INTO collection_name[, collection_name] ….

   Note:  Examples 2, 3, and 4 use EMP and DEPT tables from the

          scott/tiger schema.

 

Example 2

———

The following is an example for the SELECT INTO clause:

DECLARE

   TYPE NumTab IS TABLE OF emp.empno%TYPE;

   TYPE NameTab IS TABLE OF emp.ename%TYPE;

   enums NumTab; — no need to initialize

   names NameTab;

BEGIN

   SELECT empno, ename BULK COLLECT INTO enums, names FROM emp;

   FOR i in enums.FIRST..enums.LAST LOOP

      DBMS_OUTPUT.PUT_LINE(enums(i) || ‘ ‘ || names(i));

   END LOOP;

END;

/                                                                             

Example 3

———

The following is an example for the FETCH INTO clause:

DECLARE

   TYPE NameTab IS TABLE OF emp.ename%TYPE;

   TYPE SalTab IS TABLE OF emp.sal%TYPE;

   names NameTab;

   sals SalTab;

   CURSOR c1 IS SELECT ename, sal FROM emp;

BEGIN

   OPEN c1;

   FETCH c1 BULK COLLECT INTO names, sals;

   FOR i IN names.FIRST..names.LAST LOOP

      DBMS_OUTPUT.PUT_LINE(names(i) || ‘ ‘ || sals(i));

   END LOOP;

   CLOSE c1;

END;

/                                                                             

Restricciones

———–

No se puede hacer un BULK-FETCH de un cursor en un collection records.                                                                     

 

New Cursor Attribute

——————–

The new composite cursor attribute for bulk binds is %BULK_ROWCOUNT.  Its

syntax is as follows:

 

   IF SQL%BULK_ROWCOUNT(i) = … THEN

      …..

   ENDIF;

 

Example 4

———

DECLARE

   TYPE NumList IS TABLE OF NUMBER;

   depts NumList := NumList(10,20,50);

BEGIN

   FORALL i IN depts.FIRST..depts.LAST

      UPDATE emp SET sal = sal * 1.10 WHERE deptno = depts(i);

   IF SQL%BULK_ROWCOUNT(3) = 0 THEN

   DBMS_OUTPUT.PUT_LINE(‘Its 3!!!’);

   END IF;

END;

abril 7, 2009 Posted by | Database, Oracle | 4 comentarios

La Iglesia Catolica; La falsedad

En conversaciones con unos amigos después de una larga jornada de mi actividad sabatina, surgió de nuevo el tema sobre mis creencias en Dios, Diablo, Biblia, etc., como siempre fue objeto de airadas discusiones en donde algunos amigos entendidos en la materia, amigos de Dios, casi sentados su diestra expusieron y me atacaron preguntándome que cual es mi creencia, y llegar hasta el colmo de decir que porque yo leo la biblia si yo no creo.

La lectura de estos temas teológico la hago para tratar de entender lo que aun no entiendo sin la necesidad de que me impongan lo que debo leer o escuchar. Hoy en día el 70% de las personas no lee la biblia, solo se basa en escuchar a otra persona imponiendo sus reglas o sea, diciendo lo que a ellos les interesa que escuchen.

Para los creyentes La biblia es un libro sagrado que hace magia, dictado por Dios. Mentiras, este libro fue escrito por humanos y se basan un conjunto de libros, muchos libros, mas lo que no se conocen que los que se conocen, y estos son los que les interesan a las iglesias que leamos.

Las religiones, principalmente la católica han tenido que ir cambiando de tiempo en tiempo, y han sido culpables de innumerables muertes, recordemos Las cruzadas, que fueron una serie de campañas militares comúnmente hechas a petición del Papado, y que tuvieron lugar entre los siglos XI y XIII, contra los turcos selyúcidas y sarracenos (llamados así los musulmanes) para la reconquista de Tierra Santa.  En la conquista, los cruzados realizaron terribles matanza, no respetaban a judíos ni a musulmanes, mujeres o niños. La inquisición eran instituciones dedicadas a la erradicación de la herejía por orden de la iglesia católica.

El Vaticano, que constituye el símbolo de la corrupción, el crimen y la mentira en el mundo, desde que se constituyo, ha creado un imperio de miedo y fanatismo que le ha sido muy útil para llevar a cabo acciones abominables como la cristianización, como es el caso de las cruzadas, la conquista de América y de África, su lucha sangrienta contra la mal llamada herejía, su participación en guerras y crímenes a lo largo de la historia.

Aquí les dejo algo de historia y sea usted el jurado.

En el año 311, el emperador Constantino se convierte al cristianismo, para tratar de ocultar sus crímenes, las jerarquías cristianas se convirtieron en el brazo criminal que unía los intereses de las castas dominantes.

Año 314, con Galerio, Licinio y Constantino, la Iglesia sella con el Estado una estrecha alianza que se prolongara por siempre. En el “Edicto de Milán” los obispos decretan en Arles la condena eterna de cualquier rebelde.

 

Luego el alto clero cristiano asumió la posesión de grandes extensiones de tierra y a quienes le hicieran resistencia condenaban como “herejes” y les expropiaban sus propiedades. Se inicia una persecución inmisericorde contra todo lo que pusiera en duda los dogmas y la conducta de esa horrenda casta jerárquica cristiana.

Uno de los que argumentaron la necesidad de estos tratos violentos y exterminio físico de los herejes fue Agustín de Tagarte (345-430) doctor y padre de la Iglesia, para el era mejor quemar a un hereje que abandonarlo en sus errores.

Jerónimo, otro padre de la Iglesia, exhortaba a liquidar a un tal Vigilancio, en nombre de la salvación de su alma.

En el año 382, Teodosio I, suscribió edictos contra maniqueos y paganos donde se contemplaban condenas de muerte y confiscación de bienes. Se iba creando así lo que en el futuro seria la santa Inquisición.

La persecución a la que fueron sometidos los cristianos gnósticos, quienes fueron denunciados viciosamente como herejes, mientras que sus libros sagrados eran robados y quemados. Los gnósticos hacían una distinción entre el Padre Celestial y el dios de la Biblia Hebrea, Yahvé o Jehová, mientras que la Iglesia confunde a Yahvé o Jehová, con el Dios Absoluto.

Año 415, el obispo de Alejandria, Cirilo I, fue el verdugo de Hipatia. Ordeno a monjes para que la emboscaran, estos la violaron, torturaron, sus tendones fueron cortados con afiladas conchas y finalmente fue descoyuntada. El pecado de Hipatia fue haber sido hermosa, filosofa neoplatónica y maestra de matemáticas.

Esta Iglesia, supuesta seguidora de Jesús, no tuvo reparos en llevar a la hoguera a miles de mujeres inocentes acusadas de brujería, o de haber cometido pecados carnales.

Siglo XV: Cruzadas contra los Husitas, miles muertos.

En 1538 el Papa Pablo III declara una cruzada contra la Inglaterra apostata y declara a todos los ingleses esclavos de la Iglesia (afortunadamente no tuvieron el poder para enforzar el decreto).

1568 La Inquisición española ordena el exterminio de tres millones de rebeldes en Holanda (en esa época española).

Entre 5000 y 6000 protestantes fueron ahogados por las tropas españolas católicas, «un desastre que los burghers of Emden se dieron cuenta por los miles de sombreros holandeses que flotaban».

En 1 562 estalló en Francia una guerra civil religiosa intermitente, que duró hasta 1 572. El acontecimiento más destacado de esta, fue la matanza de San Bartolomé, que ocurrió en París la noche del 24 de agosto de 1 572, donde los católicos irrumpen contra los hugonotes (protestantes) arrancándolos de sus camas los degollaron, agarrotaron o mataron a tiros. El asesinato en masa dejó esa noche a unos 3 000 hugonotes muertos, en las semanas siguientes la orgía de muerte que llevaban a cabo los católicos continuo en las provincias, acabando con la vida de al menos unos 20 000 hugonotes mas. Toda esta matanza fue ordenada por el Papa Pio V.

Las fortunas de los judíos y musulmanes en las Cruzadas, pasaron a ser propiedad de la Iglesia.

La fortuna del Vaticano fue acumulada en su mayoría por el saqueo a las víctimas de genocidios, como los Incas, los protestantes, cuyos bienes fueron embargados durante la Inquisición.

Los conquistadores de España destruyeron el Popol Vuh de los aztecas, a quienes encarcelaron, torturaron y mataron en nombre de su dios cristiano, robando así enormes fortunas de oro.

El 17 de febrero de 1 601 la plaza romana de Campo dei fiori veia como Giordano Bruno, despojado de sus ropas y atado a un palo, con la lengua aferrada en una prensa de madera para que no pudiese hablar, fue quemado vivo, al igual que sus trabajos, en cumplimiento de la sentencia dictada pocos días antes por el tribunal romano de la Inquisición, tras un largo y tortuoso proceso iniciado en Venecia en 1 592 que lo declaro hereje, impertinente y obstinado.

Giordano Bruno rechazaba la influencia de la Iglesia en la política, realizo una reforma cosmológica, apoyaba el heliocentrismo, la idea del movimiento de la Tierra, el universo infinito y la pluralidad de los mundos animados.

Creía también en que Dios era el alma del universo y que las cosas materiales no son mas que manifestaciones de un único principio infinito. Fue el primer Panteísta, doctrina en la que se cree que dios es todo el Universo y no una personalidad.

La Iglesia puede sacarse de encima el caso de Galileo con una suave y condescendiente explicación. Bruno se le queda en la garganta.

En el siglo XIX se erigió una estatua dedicada a la libertad de pensamiento en el lugar donde tuvo lugar su martirio.

Galileo Galilei, en 1 633 fue condenado como hereje por la santa Inquisición, Galileo fue torturado y sometido a vejámenes. Fue obligado a vestir traje de penitencia y con la mano sobre la Biblia recitar la horrible formula de abjuración “Abjuro, maldigo y detesto los citados errores y herejías…”. La arrogante Iglesia humillo el honor de Galileo y se atribuyo el derecho de decidir sobre la ciencia (es algo que actualmente lo sigue haciendo, como ejemplo esta la clonación de humanos) la única falta de Galileo fue apoyar el modelo heliocéntrico de Copernico, en el cual la Tierra giraba alrededor del Sol, según la Iglesia, en ese entonces esta hipótesis iba en contra de la Biblia.

Siglo XVII: Los católicos matan a Gaspard de Coligny, un líder protestante. Después de asesinarlo, la horda católica mutila su cuerpo, «cortándole su cabeza, sus manos y sus genitales… después lo tiran al río, después, decidiendo que no era digno de ser comido por los peces, es sacado del agua y arrastrando lo que quedaba… lo llevan a Montfaulcon, para ser carne de carroña, gusanos y cuervos».

 

Siglo XVII: Los católicos saquean la ciudad de Magdeburg (Alemania). Alrededor de 30,000 protestantes muertos. «En una sola iglesia 50 mujeres fueron encontradas decapitadas,» cuenta el poeta Friedrich Schiller, «y los infantes se encontraban todavía en los pechos de sus madres muertas».

Siglo XVII: Durante la guerra de los 30 años (católicos vs. protestantes) por lo menos el 40% de la población es muerta, en su mayoría en Alemania.

San Ambrosio, obispo de Milán, durante el imperio de Teodosio, instigo al primer incendio de una sinagoga en Kallinikon (hoy Raqqa, Irán), el santo declaro haber dado la orden, ya que los judíos eran merecedores de la muerte. Los ejecutores de la orden fueron monjes, hombres brutales que en los siglos III y IV más que santos eran seres violentos y asesinos.

Miles de víctimas asesinadas en nombre de Dios durante la conquista de América, donde a los nativos que sobrevivieron se les anulo su cultura y su religión.

Más asesinatos durante la Guerra Civil Española, siendo ejecutado todo aquel que no compartía los dogmas católicos.

La Iglesia Católica bendijo el asesinato de rojos durante el franquismo.

Participación durante la Segunda Guerra Mundial, en el expolio de oro judío que fue a parar a las arcas del Vaticano.

La connivencia de la jerarquía cristiana con Hitler al comenzar la II Guerra Mundial, es decir su disimulo y participación en los miles de crímenes que dejo como saldo esta irracional guerra.

El antisemitismo de la Iglesia a lo largo de los siglos, lo que ocasiono la muerte de millones de judios en el mundo.

Los crímenes cometidos contra aborígenes australianos, que incluyen el coger por la fuerza a miles de niños para meterlos en instituciones católicas.

Lo mismo ocurrió en poblaciones autóctonas del Québec y otros lugares apartados del mundo.

El desfalco de la Iglesia al Banco Ambrosiano por la suma de 1 373 millones de dólares, suma que el cardenal Marzinskus utilizo para desestabilizar el régimen comunista de Polonia y financiar los asesinatos de la organización paramilitar argentina “Triple A”.

Los crímenes cometidos por la Iglesia en Colombia, entre los años 1 946 y 1953, fueron asesinadas unas 300 000 personas que se opusieron a la dominación capitalista, la Iglesia estuvo al lado del gobierno de turno.

Las dictaduras de Argentina, Brasil, Chile, Bolivia entre otras, estuvieron siempre legitimadas por los jerarcas de la Iglesia.

 

La oscura vinculación de la Iglesia, siendo cardenal Juan Luis Cipriani, con el gobierno fujimorista en el Perú (1995-2001).

 Al mencionar brevemente algunos de los delitos cometidos por la Iglesia a través de la Historia, salta la pregunta de quién le dio derecho a realizar tantos crímenes, el derecho a quemar a filósofos y pensadores, el derecho a quemar brujas, el derecho a quemar libros, el derecho a provocar guerras, el derecho a ser cómplices de otros asesinos, el derecho a regentar bancos y empresas, el derecho a apropiarse de lo ajeno, el derecho a proteger a curas pervertidos sexuales, el derecho a vivir en medio de la riqueza, el derecho a no pagar impuestos.

La alianza Iglesia-Gobierno es un hecho irrefutable, ambos poderes del terror llevan las riendas del mundo, conduciéndonos hacia la miseria y autodestrucción. El poder político y económico paga los favores prestados por la Iglesia. El primero, por bendecir y justificar su impunidad y el segundo por mantener aborregadas a las masas, manteniendo así su status social.

Para ello los gobiernos a través de las leyes protegen a la Iglesia y hasta disponen de una asignatura en las escuelas y colegios, camuflada bajo el nombre de religión, cuando mas bien debería llamarse “adoctrinamiento católico”.

Afortunadamente muchas de las atrocidades eclesiásticas han salido a la luz, ello impide que las personas de mayor capacidad intelectual caigan en el engaño.

El Vaticano y toda su casta de sacerdotes y monjes siguen utilizando el fraude, la mentira y su inseparable hipocresía, para seguir manteniendo en el engaño a la población, todo ello con la finalidad de proteger sus intereses y seguir en el poder, ocultando su malévolo rostro y oscuras intenciones tras el verdadero mensaje de Jesús.

abril 7, 2009 Posted by | Religion | 2 comentarios

Que ladronazo!!

Esto no es un montaje, no es un anuncio, es realidad. Este video fue captado por una de las camaras de seguridad de Tricom, en uno de los lugares donde Tricom tiene facilidades. Tricom se ha visto en la necesidad de enviar este video y ofrecer una recompensa de RD$100,000.00 pesos a la persona que pueda identificar o dar alguna referencia que conecten con esta banda de delincuentes.

 

marzo 23, 2009 Posted by | General | Deja un comentario

El WBC

El WBC es un evento novedoso y bien organizado, que busca presentar al mundo la forma de jugar al beisbol,  está definido como el pasa tiempo americano pero realmente se origino en Europa por el Siglo XV.  La primera referencia del término “base ball” se da en 1744 poco menos de 100 años antes de que Abner Doubleday supuestamente lo inventara en Cooperswton, Nueva York en 1839.

Este evento fue organizado con la creencia que de que EU iba a acabar en esos juegos, pero se le fue el tiro por la culata. En el primer clásico no contaban con la sorpresa de que iba a ser ganado por Japón, pero mucho menos que el segundo clásico podría ser ganado por Japón o Corea.

La verdad es que no hay forma que Japón y/o Corea pierdan los próximos clásicos, estamos hablando de una verdadera potencia del beisbol, desarrollando técnicas nuevas de jugar al beisbol y siguiendo un patrón o librito que no hay dudas no se salen de él. Son metódicos, sus lanzadores tiran todos igualitos, rara vez conceden una transferencia porque saben poner la bola donde les da la gana, sus bateadores también utilizan la misma técnicas, les tiran el cuerpo a la bola y hacen un movimiento similar al del lanzador y para colmos todos son igualitos físicamente, que difícil se hace identificarlos. Ademas de eso, hay como 20 que se apellidan “LEE”, para hacer más difícil la situación. No hay bateador exonerado de no tocar la bola, todos tienen que tocar cuando se les indique, jugar contra estos dos equipos asiáticos es un verdadero dolor de cabeza.

Los entrenamientos son rigurosos y no aptos para holgazanes, ya varios latinos han sido expulsados y otros salieron corriendo, entienden que jugar beisbol  es su profesión y tienen que estar listo para jugar siempre y no hacer lo que hacen “Las súper estrellas Dominicanas” cuando se acaba la temporada, irse a su país a llenarse la barriga de cerveza, andar en Hommers, situarse en equina de colmados, cometer todo tipos de fechorías, etc., ¡qué vergüenza!

Otra cosa, ningún dueño de equipo de las grandes ligas, si el jugador pertenecen a ese circuito, puede impedir que los jugadores representen a su país, es una cuestión de honor y eso no es negociable.

Definitivamente, si Japón o Corea continúan en el clásico con ese tipo de organización y dedicación siempre serán los favoritos, pero no en papel. Bien por Japón y Corea los verdaderos Campeones Mundiales de Beisbol.

marzo 23, 2009 Posted by | Beisbol, Deporte | 7 comentarios

Manejo de tablas grandes en Oracle

Tablas Particionadas en Oracle

 

Es un esquema de organización de los datos con el cual podemos dividirla en múltiples objetos de almacenamientos llamados particiones de datos o rangos, dependiendo los valores puede ser dividido en uno o más columnas de la tabla. Cada particiones de datos es almacenado separadamente. Estos objetos almacenados pueden estar en diferentes tablespaces, en el mismo o en una combinación de ambos.

 

Esta nueva forma de almacenamiento de datos fue introducido por primera vez en 8i (8.1.7) como una nueva característica de Data Warehouse para manejo de grandes cantidades de información, realmente fue introducido para hacer más fácil la tarea de mantenimiento de tablas a los administradores de bases de datos. Cuando hay tablas con millones de registros la única forma de darles manteamiento era eliminando los registros utilizando la sentencia DELETE, durando esto un tiempo indefinido y  utilizando grandes recursos del sistema.  Con la introducción de esta nueva forma de organizar la información podemos hacerlo de una forma inteligente, de forma tal que al momento de hacerle mantenimiento solo ejecutar TRUNCATE TABLE …  PARTITION durando esto unos cuantos segundos. Las ventajas son numerosas pues también podemos hacer una búsqueda mucho más rápida sobre tabla particionada,  podemos ir directamente y buscar la información necesitada con solo ejecutar  SELECT …  FROM table PARTITION ( …..) where …, de esta forma solo buscara la información en la partición o particiones indicadas agilizando la búsqueda significativamente o simplemente hacer un backup de la partcion deseada.

 

Para crear una tabla particionada tenemos que antes analizar el  por qué y el cómo, primero debemos saber para qué queremos particional una tabla, las opciones pueden ser por organización, mantenimiento, distribución de la data, buscar más fácilmente la información, etc., luego de tener el por qué procedemos a analizar el cómo hacerlo para esto tenemos que tener en consideración las opciones dependiendo la versión de Oracle que tengamos, ej.

 

Oracle 8i, solo tiene tres forma de organizar la data, Range, Hash, Composite

 

Oracle 9iR2/10g, tiene Range, Hash, Composite, List

 

Range:

 

Esta forma de particionamiento requiere que los registros estén identificado por un “partition key”  relacionado por un predefinido rango de valores. El valor de las columnas “partition key” determina la partición a la cual pertenecerá el registro.

 

Create table test164874 (

ord_day          NUMBER(2),

ord_month      NUMBER(2),

ord_year         NUMBER(4),

ord_id            NUMBER(10)

)

storage (initial 12k next 12k pctincrease 0 minextents 1)

PARTITION BY RANGE (ord_year,ord_month,ord_day)

(

PARTITION P1 VALUES LESS THAN (2001,3,31)   TABLESPACE PART1,

PARTITION P2 VALUES LESS THAN (2001,6,30)   TABLESPACE part2,

PARTITION P3 VALUES LESS THAN (2001,9,30)   TABLESPACE part3,

PARTITION P4 VALUES LESS THAN (2001,12,32) TABLESPACE part4

)

 

Este tipo de particionamiento esta mejor situado cuando se tiene datos que tienen rango lógicos y que pueden ser distribuidos por este. Ej. Mes del Año o un valor numérico.

 

 

Hash:

 

Los registros de la tabla tienen su localización física determinada aplicando un valor hash a la columna del partition key, este valor es provisto y determinado automáticamente.

 

CREATE TABLE tabpart2(
ord_id   NUMBER(5),
ord_date DATE
)
PARTITION BY HASH(ord_id)
(PARTITION P1 TABLESPACE tbs1,
 PARTITION P2 TABLESPACE tbs2,
 PARTITION P3 TABLESPACE tbs3,
 PARTITION P4 TABLESPACE tbs4
)

 

El particionamiento Hash es mejor utilizado en data que no se presta fácilmente a un particionamiento RANGE, pero que debe ser particionada por razones de performance. EL particionamiento HASH eventualmente distribuye la data entre un numero especifico de particiones. Los registros son alojados en las particiones basados en el valor hash del «partition key».

 

Composite:

 

Este tipo de particionamiento es un compuesto del particiomaniento RANGE y el HASH.

 

Tiene dos tipo de particionamiento o dos partition key, la primera un range partition key y el hash partition key. Este tipo de particionamiento de tablas hace uso de subpaticiones vía el hash. Este consiste en un conjunto de particiones Range, las cuales están compuesta de particiones HASH.

 

 

CREATE TABLE TAB2(
     ord_id     NUMBER(10),
     ord_day    NUMBER(2),
     ord_month  NUMBER(2),
     ord_year   NUMBER(4)
     )
  PARTITION BY RANGE(ord_year,ord_month,ord_day)
  SUBPARTITION BY HASH(ord_id) 
  SUBPARTITIONS 8
   ( PARTITION q1 VALUES LESS THAN(2001,3,31)
     ( SUBPARTITION q1_h1 TABLESPACE TBS1,
       SUBPARTITION q1_h2 TABLESPACE TBS2,
       SUBPARTITION q1_h3 TABLESPACE TBS3,
       SUBPARTITION q1_h4 TABLESPACE TBS4
     ),
     PARTITION q2 VALUES LESS THAN(2001,6,30)  
     ( SUBPARTITION q2_h5 TABLESPACE TBS5,
       SUBPARTITION q2_h6 TABLESPACE TBS6,
       SUBPARTITION q2_h7 TABLESPACE TBS7,
       SUBPARTITION q2_h8 TABLESPACE TBS8
     ),
     PARTITION q3 VALUES LESS THAN(2001,9,30)  
     ( SUBPARTITION q3_h1 TABLESPACE TBS1,
       SUBPARTITION q3_h2 TABLESPACE TBS2,
       SUBPARTITION q3_h3 TABLESPACE TBS3,
       SUBPARTITION q3_h4 TABLESPACE TBS4
     ),
     PARTITION q4 VALUES LESS THAN(2001,12,31) 
     ( SUBPARTITION q4_h5 TABLESPACE TBS5,
       SUBPARTITION q4_h6 TABLESPACE TBS6,
       SUBPARTITION q4_h7 TABLESPACE TBS7,
       SUBPARTITION q4_h8 TABLESPACE TBS8
     )
   )
/

 

El tipo de particionamiento Composite usa el método RANGE con cada partición y HASH con las subparticiones. Son ideales para almacenamiento de históricos y striping de datos.

 

 

List:

 

Oracle9i añade un nuevo método de particionamiento. Este nuevo método permite explícitamente un control sobre como los registros se guardan en las particiones, permitiendo especificar una lista de valores para el partition key.

 

CREATE TABLE sales_list
(salesman_id NUMBER(5),
salesman_name VARCHAR2(30),
sales_state VARCHAR2(20),
sales_amount NUMBER(10),
sales_date DATE)
PARTITION BY LIST(sales_state)
(
PARTITION sales_west VALUES('California', 'Hawaii'),
PARTITION sales_east VALUES ('New York', 'Virginia', 'Florida'),
PARTITION sales_central VALUES('Texas', 'Illinois')
PARTITION sales_other VALUES(DEFAULT)
);

 

 

Características

 

– No soporta múltiples columnas

– Los valores literales deben ser únicos entre toda la lista

– NULL puede ser especificado como un valor literal de la partición

– MAXVALUE no puede ser especificado

– Toda la lista debe tener por lo menos un valor literal

 

 

Espere más informaciones sobre este tema.

marzo 23, 2009 Posted by | Database, Oracle, Tecnologia | 6 comentarios

Un Rubirosa en New York

Al Rod contrató varias prostitutas del “Empire´s  Club” y enamoró hasta  la proxeneta 
 
NUEVA YORK._ Al Rodo, la súper estrella de los Yankees de Nueva York, no sale de un escándalo para sonar en otro. Ahora la famosa proxeneta  del “Empirés Club” (Club de Emperadores” Kristin Davis asegura que el pelotero se acostó con más de media docena de sus prostitutas y que hasta a ella, la enamora, asegurando que los contactos entre ambos continúan.

Davis, es la misma traficante de jóvenes de “la vida alegre” que conectaba prostitutas con el ex gobernador del estado Eliot Spitzer, quien se vio obligado a renunciar por el escándalo generado cuando los medios descubrieron que llevaba frecuentemente a una de ellas a un hotel en Washington.

Alex, se ha acostado con las mujeres contratadas,  en el hotel “Tour Seasons” (Cuatro Estaciones) de la calle 57 en Manhattan y en otro de Filadelfia,  revela un reporte publicado ayer domingo por el tabloide local NY Daily News, pero la mujer que las negocia,  también ha tenido citas con el deportista.

“Las muchachas lo encontraron tan encantador que muchas de ellas llegaron a acostar gratuitamente con Alex”, dijo la mujer. El jugador halagaba regularmente a la proxeneta con flores, joyas y enviándole correos electrónicos.  Davis dijo que a lo largo de los años ha logrado hacer amistad con un sin número de clientes por lo que no ve razones en que no pueda conservar sus números de teléfonos o e- mails, como el caso de Alex de quien el medio sostiene que mantiene contactos con ella.

“En lo que respecta a Alex, lo único que puedo decir es que nuestros caminos se han cruzado personal y profesionalmente”, añadió la proxeneta, recordando que uno de los encuentros de ellos se produjo en junio del 2006 en un gimnasio de Filadelfia, poco después que ella abrió una sucursal de su negocio de “trata de blancas”.

Señaló que una de las primeras de sus mujeres que se acostó con Alex, no sabía que se trataba del pelotero, pero “se lo encontró caliente como el infierno”.  Reveló que luego el pelotero dio su nombre real y entonces se dieron cuenta de quién se trataba. “La chica que le enviamos se asustó, porque su padre hace trabajos para otro equipo de las Grandes Ligas”, agregó.

Rodríguez, se convirtió rápidamente en uno de los clientes más asiduos de David especialmente en sus negocios de Manhattan. Y dijo que Alex, le envió un e-mal el 17 de noviembre del 2006 en el que le dice: “gracias por haberme enviado a Samantha, ella es muy hermosa, pero no es usted”.

El pelotero le preguntó cómo podía ver la hermosura de la señora Davis de cerca, a lo que ella respondió que “gracias por los elogios, eres muy dulce, no soy divertida, pero te envío algunas fotos mías”.

Entonces el jugador le replicó: “ha sido difícil esperar durante todo un año” y la señora Davis le respondió: “no estoy jugando, talvez usted debería hacer mayores esfuerzos”. Y el pelotero le contestó que “definitivamente usted me encanta y se ve muy hermosa en las fotos.

Ella dijo “eres muy dulce, desde llegue alguien que te guste, te la voy a enviar”.

marzo 23, 2009 Posted by | Beisbol, Deporte | Deja un comentario

Google, obligado a retirar imágenes callejeras por las protestas

Google se ha visto obligado a retirar algunas imágenes callejeras de su nuevo servicio «Uk Street View» ante las protestas de personas que aparecían en ellas sin haber dado su permiso. Entre las imágenes retiradas del portal de internet figuran las de un hombre entrando en una tienda de objetos eróticos, personas en el momento de ser detenidas por la policía, así como interiores reveladores de algunos hogares. Una portavoz de Google informó a la BBC de que cualquier persona puede solicitar que se elimine su imagen del servicio, que cubre 36.000 kilómetros de calles y carreteras de veinticinco ciudades del Reino Unido, de las que ofrece vistas panorámicas. «Tenemos millones de imágenes de forma que el porcentaje de las que hemos eliminado es ínfimo», explicó la portavoz. Los internautas pueden utilizar el zoom y ver las calles casi como si estuviesen transitándolas gracias a imágenes captadas por una flota de automóviles en los que se instalaron cámaras de 360 grados. El proyecto ha suscitado críticas de grupos como «Privacy International», según los cuales «las imágenes se han captado sin el permiso de la gente para un uso comercial, lo que no es aceptable desde el punto de vista legal». El Comisario de Información del Gobierno británico analizó en su día el proyecto de Google y le dio su visto bueno, argumentando que la empresa norteamericana había puesto a punto una serie de garantías para asegurar la privacidad, difuminando las caras de las personas o las matrículas de los automóviles. Street View se inauguró en Estados Unidos en mayo del 2007 y funciona ya en España, Italia, Francia, Holanda, Japón, Australia, Nueva Zelanda.

marzo 22, 2009 Posted by | Tecnologia | Deja un comentario

Micosoft lanza su nuevo navegador Internet Explorer 8

El gigante informático estadounidense Microsoft anunció el jueves el lanzamiento de Internet Explorer 8, una nueva versión de su ubicuo navegador, que según la empresa incorpora novedades que lo hacen más seguro y que permite que las páginas bajen más rápidamente.

Internet Explorer 8 está disponible a partir del jueves para su descarga en 25 idiomas, informó la firma con sede en Redmond, (Estado de Washington, noroeste), en un comunicado.

 

Microsoft señaló que el IE 8 es más rápido que los navegadores anteriores de Explorer e incluye «características de seguridad que responden directamente a las crecientes preocupaciones del público sobre la seguridad en internet».

 

Según la firma de investigación Net Applications, en enero IE tenía el 67,5% del mercado de navegadores.

Descargar aqui:

http://www.microsoft.com/windows/internet-explorer/default.aspx

marzo 21, 2009 Posted by | Microsoft, Tecnologia | 1 comentario

Oracle Tips: Pivot Feature

Pivot

Muchas veces hemos querido hacer una salida de reporte tipo hoja electronica o crosstab pero el mismo no es posible sin la necesidad utilizar un motor o enging que recolecte la información y a través de vectores nos entreguen la información tabulada. Pues bien, la versión de Oracle 11g nos trae la opcion Pivot:

 

Como sabrás, las tablas relaciones son tabulares, o sea, son presentadas en columnas: Ej CUSTOMER

SQL> desc customers
 Name                                      Null?    Type
 ----------------------------------------- -------- ---------------------------
 CUST_ID                                            NUMBER(10)
 CUST_NAME                                          VARCHAR2(20)
 STATE_CODE                                         VARCHAR2(2)
 TIMES_PURCHASED                                    NUMBER(3)

 

When this table is selected:

 
select cust_id, state_code, times_purchased
from customers
order by cust_id;

The output is:

CUST_ID STATE_CODE TIMES_PURCHASED
------- ---------- ---------------
      1 CT                       1
      2 NY                      10
      3 NJ                       2
      4 NY                       4
... and so on ...

 

Note como los datos son presentados como filas: Para cada cliente, el registro presenta el estado donde vive cada cliente y cuantas veces el mismo ha comprado algo para esa tienda. Cuantas veces el cliente compra mas artículos, la columna Times_purchased es actualizada.

 

Ahora considerar el caso en donde se desee tener un reporte de compra frecuente en cada estado,  cuantos clientes compraron solo una vez, dos, tres …etc, en cada estado.  Para realizarlo en un SQL, usamos la siguiente declaración:

 
select state_code, times_purchased, count(1) cnt
from customers
group by state_code, times_purchased;

 

Here is the output:

ST TIMES_PURCHASED        CNT
-- --------------- ----------
CT               0         90
CT               1        165
CT               2        179
CT               3        173
CT               4        173
CT               5        152
... and so on ...

 

Esta es la informacion que se necesitaba pero es un poco difícil de leer. Una mejor forma es representar la misma data a través de un reporte crosstab, el cual pueda organizar la data verticalmente y el estado horizontal, tal como lo haríamos en una hoja electrónica.

 
Times_purchased
             CT           NY         NJ      ... and so on ...
 
1             0            1          0      ...
2            23          119         37      ...
3            17           45          1      ...
... and so on ... 

 

Anterior a Oracle 11g, podias hacerlo outilizando algo como la función decode para cada valor y escribir cada valores distintos en columnas separadas. Tecnica obsoleta después de 11g, pues contamos con una nueva característica llamada PIVOT para presentar cualquier búsqueda en un formato crosstab. Ej.

 
select * from (
   select times_purchased, state_code
   from customers t
)
pivot 
(
   count(state_code)
   for state_code in ('NY','CT','NJ','FL','MO')
)
order by times_purchased
/

Here is the output:

 
. TIMES_PURCHASED       'NY'       'CT'       'NJ'       'FL'       'MO'
--------------- ---------- ---------- ---------- ---------- ----------
              0      16601         90          0          0          0
              1      33048        165          0          0          0
              2      33151        179          0          0          0
              3      32978        173          0          0          0
              4      33109        173          0          1          0
... and so on ...

 

Esto presenta el poder del operador PIVOT. El state_code son presentado como el registro encabezado, en vez de una columna.

 

En un reporte crosstab, si desea transportar la columna del tiempo de compra al encabezado la columna se convierte en los registros, como si la columna se rotaran 90 grados.  

 

This expression needs to be in the syntax of the query:

...
pivot 
(
   count(state_code)
   for state_code in ('NY','CT','NJ','FL','MO')
)
...

 

La segunda line, “for state_code …,” limita la busqueda a solo esos valores. Esta línea es necesaria, pues desafortunadamente tienes que poner un limite. Esta restricción no se da en XML.

Note the header rows in the output:

. TIMES_PURCHASED       'NY'       'CT'       'NJ'       'FL'       'MO'
  --------------- ---------- ---------- ---------- ---------- ----------

La columna que forma el encabezado son data de la misma tabla: El state_code. Suspongamos que se desee presentar el nombre del estado y no la abreviación.

 («Connecticut» instead of «CT»)?  en este caso se hace un pequeño ajuste en la clausula FOR:

 
select * from (
   select times_purchased as "Puchase Frequency", state_code
   from customers t
)
pivot 
(
   count(state_code)
   for state_code in ('NY' as "New York",'CT' "Connecticut",'NJ' "New Jersey",'FL' "Florida",'MO' as "Missouri")
)
order by 1
/
 
Puchase Frequency   New York Connecticut New Jersey    Florida   Missouri
----------------- ---------- ----------- ---------- ---------- ----------
                0      16601         90           0          0          0
                1      33048        165           0          0          0
                2      33151        179           0          0          0
                3      32978        173           0          0          0
                4      33109        173           0          1          0
... and so on ...

marzo 17, 2009 Posted by | Developer, Oracle, Tecnologia | 1 comentario

Moises; la falacia

En mis publicaciones anteriores sobre la religión hemos vistos algunos escritos no concordantes dentro del libro sagrado “La Biblia” . El antiguo testamento es un libro olvidado que nadie hace referencia por todos los errores e incongruencias que ahí existen, pero hay un caso muy especial y trata sobre el pentateuco, que no es más que los cincos primeros libros del antiguo testamento, Génesis, Éxodos, Levítico, Números y Deuteronomio estos libros escritos en hebreo se les atribuye su creación a Moisés, quien vivió 120 años.

Moises, profeta, según la biblia (Antiguo Testamento) nos es más que una gran falacia, nunca existió como figura histórica, las referencia que existen datan de muchos siglos después de la época en que supuestamente vivió. Incluso si Moisés se acepta como figura histórica, hay varios aspectos del relato bíblico que pueden ser reinterpretados. La teoría de Manetón de que Moisés era egipcio es absolutamente plausible. Se ha sugerido que pudo haber sido un noble o príncipe egipcio influido por la religión de Atón (véase la teoría de Freud más abajo), o simplemente un simpatizante de la cultura hebrea. Mosés es un nombre egipcio que significa ‘hijo’ y se utilizó a menudo en los nombres de los faraones (como por ejemplo TutMoses). Los hebreos pudieron haber creado la historia a partir de los relatos de Sargón de Acad (mesopotámico) o Edipo (griego) para legitimar su creencia. Por otra parte, antiguamente las clases más bajas abandonaban a veces a sus hijos, y Moshe es una palabra hebrea (que significa ‘rescatado de las aguas’).

Deuteronomio

Se trata de un libro esencialmente religioso, aunque no es un tratado teológico. Su definición más simple es que consiste en un fuerte llamado a vivir con Yahvéh y a respetar el Pacto.

Es, en última instancia, una amenaza. Dios ha entregado una Ley en Sinaí y ha suscrito una Alianza, pero esa Alianza caerá frente a un socio (el pueblo) donde unos estafan o explotan a los otros. Si el Pacto cae, el apoyo divino fallará y grandes desastres se abatirán sobre Israel. Esta política de Dios no es negociable, así que la última misión de Moisés es advertir a los hebreos que cumplan el pacto cuando él ya no esté.

Incongruencia:

Deuteronomio, Capítulo 34: Muerte y sepultura de Moisés

34:1 Subió Moisés de los campos de Moab al monte Nebo, a la cumbre del Pisga, que está enfrente de Jericó; y le mostró Jehová toda la tierra de Galaad hasta Dan,
34:2 todo Neftalí, y la tierra de Efraín y de Manasés, toda la tierra de Judá hasta el mar occidental;
34:3 el Neguev, y la llanura, la vega de Jericó, ciudad de las palmeras, hasta Zoar.
34:4 Y le dijo Jehová: Esta es la tierra de que juré a Abraham, a Isaac y a Jacob, diciendo: A tu descendencia la daré. Te he permitido verla con tus ojos, mas no pasarás allá.
34:5 Y murió allí Moisés siervo de Jehová, en la tierra de Moab, conforme al dicho de Jehová.
34:6 Y lo enterró en el valle, en la tierra de Moab, enfrente de Bet-peor; y ninguno conoce el lugar de su sepultura hasta hoy.
34:7 Era Moisés de edad de ciento veinte años cuando murió; sus ojos nunca se oscurecieron, ni perdió su vigor.
34:8 Y lloraron los hijos de Israel a Moisés en los campos de Moab treinta días; y así se cumplieron los días del lloro y del luto de Moisés.
34:9 Y Josué hijo de Nun fue lleno del espíritu de sabiduría, porque Moisés había puesto sus manos sobre él; y los hijos de Israel le obedecieron, e hicieron como Jehová mandó a Moisés.
34:10 Y nunca más se levantó profeta en Israel como Moisés, a quien haya conocido Jehová cara a cara;
34:11 nadie como él en todas las señales y prodigios que Jehová le envió a hacer en tierra de Egipto, a Faraón y a todos sus siervos y a toda su tierra,
34:12 y en el gran poder y en los hechos grandiosos y terribles que Moisés hizo a la vista de todo Israel.

¿Si él fue el autor como pudo escribir sobre su propia muerte?

marzo 17, 2009 Posted by | Religion | 1 comentario

Oracle Standard Edition una opcion

La opcion de base de datos Oracle RAC, disponible en Oracle Enterprise Edition, ya esta disponible en Oracle Standard Edition, esto siginifica que usted puede crear su Grid Computing de 4 nodos a un bajo costo y sin la necesidad de tener que pagar por la version Enterprise para poder hacer un Cluster. En realidad esto es una buena iniciativa ayudando asi a reducir los costos en la creacion de cualquier proyecto utilizando la base de datos con la opcion de Real Application Cluster (RAC).  Si comparamos los costos entre una Base de Datos «Standard Edition» y una «Enterprise Edition» vemos una notable diferencia de mas del doble del costo.

                                                             Standard      Enterprise
                                                              Edition          Edition

Processor Perpetual (US$) 17,500.00     47,500.00
Named user plus                            350.00             950.00

Bien por Oracle.-

marzo 16, 2009 Posted by | Oracle, Tecnologia | Deja un comentario

El Arco Iris; Fenomeno natural o divino creado por Dios

Según la Biblia (Antiguo Testamento), el arco iris fue creado por Dios como promesa a Noe de que nunca jamás destruiría la tierra con un diluvio.

«Mi arco pondré en las nubes, el cual será por señal de convenio entre mí y la tierra. Y será que cuando haré venir nubes sobre la tierra, se dejará ver entonces mi arco en las nubes. Y acuérdame del pacto mío, que hay entre mí y vosotros y toda alma viviente de toda carne; y no serán más las aguas por diluvio para destruir toda carne.» (Génesis 9:13,15 RVA)

Más de tres siglos atrás, Isaac Newton logró demostrar con ayuda de un prisma que la luz blanca del Sol contiene colores partiendo del rojo, a su vez pasando por el naranja, amarillo, por el verde, por el azul y añil hasta llegar al violeta. Esta separación de la luz en los colores que la conforman recibe el nombre de descomposición de la luz blanca.

 

El experimento de Newton es relativamente fácil de reproducir, pues no es necesario contar con instrumental científico especial para llevarlo a cabo. Incluso hoy en día resulta ser uno de los más hermosos e instructivos para los incipientes estudiantes de óptica en educación básica, media y superior.

 

Pero muchos siglos antes de que naciera Newton la naturaleza ya había descompuesto la luz del Sol una y otra vez ante los ojos de nuestros antepasados. Algunas veces, después de una llovizna; otras, tras una tormenta. Lo cierto es que el arco iris fue durante mucho tiempo un fenómeno tan asombroso como sobrecogedor. Tomado en ocasiones como portador de augurios, en otras como inspiración de leyendas, y siempre como una obra de arte, nunca ha dejado de parecer maravilloso al ser humano.

 

La Teoría Elemental del arco iris fue, sin embargo, anterior a Newton. Desarrollada primero por Antonius de Demini en 1611, fue retomada y refinada luego por René Descartes. Posteriormente, la Teoría Completa del arco iris fue propuesta en forma inicial por Thomas Young y, más tarde, elaborada en detalle por Potter y Airy.

 

En realidad fue el Arco Iris creado por Dios en ese momento o es un fenómeno científico natural que se puede reproducir fácilmente?

 

En el momento que afirmamos que el Arco Iris fue creado por Dios en ese instante y para ese objetivo, afirmamos que no existia antes de eso y eque no se corresponde con las explicaciones cientificas, decimos tambien que anterior a ese evento nunca ocurrio un arco iris; lo cual resulta imposible de creer pues estariamos negando las fuentes que los producen como la luz del sol, el agua, etc.

 

Por favor si no tienen argumentos no traten de confundir diciendo que la biblia se basa en interpretaciones. Me gustaria que hagan sus comentarios de estos temas sin temor a conseguir la verdad.-

 

marzo 13, 2009 Posted by | Religion | 10 comentarios

La biblia; otro disparate

La Biblia (capítulo 10 de Josué, los números indican versículos)

12 Entonces Josué habló a Jehová, el día en que Jehová entregó al amorreo delante de los hijos de Israel, y dijo en presencia de los israelitas:«Sol, detente en Gabaón, y tú, luna, en el valle de Ajalón».
13 Y el sol se detuvo, y la luna se paró, hasta que la gente se vengó de sus enemigos. ¿No está escrito esto en el libro de Jaser? El sol se paró en medio del cielo, y no se apresuró a ponerse casi un día entero.14 No hubo un día como aquel, ni antes ni después de él, en que Jehová haya obedecido a la voz de un hombre, porque Jehová peleaba por Israel.
Alguien me puede explicar esto?
Que sucede si la Luna y/o el Sol se detienen?

marzo 12, 2009 Posted by | Religion | 7 comentarios

PR gana a Holanda 5-0 y Mexico a Australia 16-1

Sin comentarios, la verguenza dura mucho.

marzo 12, 2009 Posted by | Beisbol, Deporte | Deja un comentario

Principales Religiones del Mundo

Las principales religiones y tradiciones espirituales pueden clasificarse en un pequeño número de religiones mundiales. De acuerdo con datos de la Encyclopaedia Britannica, la mayoría de los adeptos religiosos se dividen en alguna de estas religiones: Cristianismo (33% de la población mundial), Islam (20%), Hinduismo (13%), Religión tradicional china (6,3%) y Budismo (5,9%). La población no teísta (agnósticos y ateos) formaría el tercer grupo con el 14% de la población total y el 4% seguiría religiones tribales.

De estas familias religiosas, las dos mayores por seguidores son las abrahámicas y las dhármicas al incluir cerca de un 90% de la población teísta mundial.

La siguiente es el listado de opciones religiosas por número de seguidores propuesta por la web Adherents.com :

  1. Cristianismo: 2.100.000.000
  2. Islam: 1.500.000.000
  3. Agnosticismo / Ateísmo / No-teísmo: 1.100.000.000
  4. Hinduismo: 900.000.000
  5. Religión tradicional china: 394.000.000 (Véase también: Religiones del este asiático )
  6. Budismo: 376.000.000
  7. Religiones indígenas: 300.000.000
  8. Religiones afroamericanas: 100.000.000
  9. Sikhismo: 23.000.000
  10. Juche: 19.000.000
  11. Espiritismo: 15.000.000
  12. Judaísmo: 14.000.000
  13. Baha’i: 7.000.000
  14. Jainismo: 4.000.000
  15. Shinto: 4.000.000
  16. Caodaísmo: 4.000.000
  17. Zoroastrismo: 2.000.000
  18. Tenrikyo: 2.000.000
  19. Neopaganismo: 1.000.000
  20. UnitarioUniversalismo: 800.000
  21. Rastafarianismo: 600.000

marzo 11, 2009 Posted by | Religion | 3 comentarios

Curso Basico de SQL (Mas SQL*PLUS)

MAS SQL*Plus

 En este apartado vamos a profundizar un poco en las otras posibilidades que nos brinda SQL*Plus en los:

  • ficheros de comandos, y
  • generación de informes,

Ficheros de Comandos

Aunque ya vimos una introducción a los ficheros de comandos en anteriormente, vamos ahora a profundizar un poco en las posibilidades que nos ofrece SQL*Plus.

En un fichero de comandos se pueden incluir:

  • líneas de comentarios,
  • líneas de ejecución,
  • líneas de comandos SQL, y
  • líneas de comandos SQL*Plus.

Líneas de Comentarios

Se pueden introducir comentarios en un archivo de comandos de tres maneras:

  • Utilizando del comando REM del SQL*Plus.
  • Utilizando los delimitadores de comentario de SQL /* y */.
  • Utilizando los símbolos de comentario PL/SQL «__».

Líneas de Ejecución

Constan de una única barra inclinada, «/», y se introducen a continuación de cada sentencia SQL indicando su ejecución.

Sustituyen al punto y coma, «;» al final de las sentencias SQL.

Líneas de Comandos SQL

Se puede introducir cualquiera de los comandos SQL enumerados en este curso, y se ejecutarán de manera secuencial.

Se permite el anidamiento de los ficheros de comandos.

Líneas de Comandos SQL*Plus

SQL*Plus aporta una serie de posibilidades al lenguaje SQL que le acerca un poco mas a lo que entendemos como un lenguaje de programación.

Se pueden definir constantes y variables, capturar datos del teclado, introducir parámetros en la llamada de un archivo de comandos, y alguna cosa más.

Variables de Usuario

Se pueden definir Variables de usuario con el comando DEFINE

DEFINE Variable = valor

Para borrar una variable se utiliza el comando UNDEFINE

UNDEFINE variable

 Como ejemplo se puede definir la variable OFICIO

SQL> define oficio=analista

 Variables de Sustitución

Las variables de sustitución son un nombre de variable de usuario con el símbolo & delante. Cuando SQL*Plus detecta una variable de sustitución en un comando, ejecuta el comando tomando el valor de la variable.

Esto se puede ver en el ejemplo, donde preguntamos por los empleados que son analistas:

SQL> define oficio=Analista

SQL> define tabla=emp

SQL> select nombre, oficio from &tabla where oficio=’&oficio’;

old   1: select nombre, oficio from &tabla where oficio=’&oficio’

new   1: select nombre, oficio from emp where oficio=’Analista’

 NOMBRE     OFICIO

———- ———–

Sastre     Analista

Recio      Analista

 Captura de Datos desde el Terminal

En muchas ocasiones es necesario recoger datos desde un terminal, que luego serán utilizados en el archivo de comandos. Para realizarlo se pueden utilizar dos medios: las variables de sustitución o los parámetros en la línea de comandos.

Cuando SQL*Plus reconoce una variable de sustitución sin valor asignado se lo pide al usuario:

 SQL> select * from dept where dname=’&Nombre_depto’;

Enter value for nombre_depto: SALES

old   1: select * from dept where dname=’&Nombre_depto’

new   1: select * from dept where dname=’SALES’

    DEPTNO DNAME          LOC

——— ————– ————-

       30 SALES          CHICAGO

 Si se desea que SQL*Plus pregunte por el valor de la variable al usuario sólo la primera vez que se encuentra con ella, se colocará «&&» delante de la variable de usuario.

También se pueden utilizar hasta nueve parámetros en la línea de comandos cuando se llama a la ejecución de un archivo de comandos.

En el archivo de comandos nos referiremos a los parámetros con las variables &1, &2, … ,&9 que se corresponden posicionalmente con ellos.

Desde el archivo de comandos se puede hacer referencia a los parámetros cualquier número de veces y en cualquier orden.

Comandos de Comunicación con el Usuario

Los siguientes comandos proporcionan un medio de comunicación con el usuario:

  • PROMPT: presenta un mensaje en la pantalla.
  • ACCEPT: Solicita un valor y lo almacena en la variable de usuario que se especifique.
  • PAUSE: Obliga al usuario a pulsar Return después de leer un mensaje.

Para ver cómo funcionan sirve el siguiente ejemplo:

prompt Buscar los datos de un empleado.

pause Pulse Return.

accept nombre_emp prompt ‘Empleado? ‘

SQL> select * from emp where ename=’&nombre_emp’;

Otros Comandos

Los siguientes comandos también se pueden incluir en un archivo de comandos:

  • CONNECT: para conectarse como otro usuario.
  • HELP: para obtener ayuda en línea.
  • EXIT: para dejar SQL*PLus y salir al Sistema Operativo.
  • DESCRIBE ó DESC: para obtener información sobre la estructura de una tabla.
  • HOST o !: para ejecutar un comando del Sistema Operativo.

Generación de Informes

Con SQL*Plus podemos dar forma a los resultados de las consultas para producir un informe. Podremos:

  • Cambiar las cabeceras de las columnas.
  • Dar forma a las columnas de tipo number, varchar2, date y long.
  • Copiar y listar atributos de presentación de las columnas.
  • Suprimir valores duplicados e introducir espacios para mejorar la presentación.
  • Realizar y mostrar cálculos (totales, medias, mínimos, máximos, etc.).
  • Definir las dimensiones de las páginas.
  • Ubicar títulos en la cabecera y pie de las páginas.
  • Introducir la fecha o el número de página en los títulos.

Pero de todo esto sólo vamos a ver el modo de realizar las operaciones más comunes y sencillas.

Básicamente, el formato con el que se van a presentar los resultados de las consultas dependen de unos parámetros y de unos comandos.

Parámetros

  • SET LINESIZE: pone el número máximo de caracteres por línea. Por defecto vale 80 y el máximo es 999.
  • SET PAGESIZE: pone el número de filas de la salida antes de empezar una nueva página. Por defecto es 25. Incluye el título y las líneas de pausa.
  • SET HEADING [ON | OFF]: Activa/desactiva la utilización de encabezados de columnas. Por defecto está activado.
  • SET NULL texto: Indica la cadena de caracteres que hay que colocar en sustitución de los valores NULL. Por defecto es «».
  • SET ECHO [ON | OFF]: Activa/desactiva la visualización de los comandos que SQL*Plus ejecuta según van siendo tratados. Por defecto está desactivada.
  • SET FEEDBACK [ n | ON | OFF]: Muestra el número de registros recuperados en cada consulta cuando se recuperan n o más registros. ON se pueden considerar como n=1, y OFF como n=0.
  • SET VERIFY [ON | OFF]: Controla la salida de confirmación para los valores de las variables de sustitución. Por defecto está activado.

Comandos

  • TTITLE: formación del encabezado de página.
  • BTITLE: formación del pie de página.
  • COLUMN: formatear cada columna.
  • BREAK: puntos de ruptura en los listados.
  • COMPUTE: realizar cálculos con las columnas.

septiembre 28, 2009 Posted by | Oracle | Deja un comentario

Curso Basico de SQL (Capitulo IV)

CAPITULO IV – DML (Data Manipulation Language)

Una vez que tenemos definida la estructura de una tabla se pueden insertan los datos, modificarlos o borrarlos de la tabla.

Esta tarea entra dentro de las operaciones que se realizan con el lenguaje DML. Este lenguaje permite manipular los objetos de la base de datos, insertando, modificando y/o borrando el contenido de las tablas. Hay que recordar que estas sentencias no son ‘auto confirmadas’ y requieren de la sentencia COMMIT para que sus efectos perduren en el tiempo, o de la sentencia ROLLBACK para deshacer los cambios efectuados.

A continuación vamos a estudiar tres de las sentencias DML más comunes.

INSERT (Inserción):

El comando que permite insertar filas en las tablas es el siguiente.

INSERT INTO tabla [({columna,}*)] VALUES ({expresión,}+);

Sólo especificaremos las columnas donde insertar
su orden cuando no insertemos datos en todas ellas o no lo hagamos en el mismo orden en que definimos la tabla.
La asociación columna-valor es posicional.
Los valores deben cumplir con los tipos de datos definidos.
Los valores de tipo caracter y fecha deben ir encerrados entre comillas simples, ('').

A continuación se puede ver la inserción de filas en las tablas de ejemplo.

SQL> insert into dept values (60,'Informatica','Neyba');
SQL> insert into emp values (101,'Rivas','VP',null,'3-FEB-96',2000,null,60);

UPDATE (Actualización):

Otra de las operaciones más comunes es la modificación de la información almacenada en las tablas.

 Para ello se utiliza el comando UPDATE cuya sintaxis se muestra a continuación.

UPDATE tabla SET {columna = expresión,}+ [WHERE condición];
Se especificará en la cláusula SET las columnas que se actualizarán y con qué valores.
La cláusula WHERE indica las filas con las que se va a trabajar.
Si se omite la actualización afectará a todas las filas de la tabla.

SQL> Update emp set ename = ‘R. Rivas’, sal = 40000  where ename = ‘Rivas’;

DELETE (Borrado):

Con insertar y modificar, la otra operación que completa el trío es la de borrado de filas. La sintaxis es la que sigue:

DELETE  tabla [WHERE condición];
 

Borrará todas las filas que cumplan la condición especificada en la cláusula WHERE. Si esta cláusula no se fija, se borrarán todas las filas de la tabla. Aquí cabe decir que aunque con DELETE borremos todas las filas de una tabla, no borramos la definición de la tabla del diccionario y podemos insertar datos posteriormente en la tabla. Esta es una diferencia con la sentencia DROP TABLE, que produce la eliminación tanto del contenido de la tabla como de la definición de la misma.

SQL> delete emp where  ename = ‘Rivas’;

SELECT (Selección):

La recuperación de los datos en el lenguaje SQL se realiza mediante la sentencia SELECT, seleccionar. Esta sentencia permite indicar al SGBD la información que se quiere recuperar. Esta es la sentencia SQL, con diferencia, más habitual. La sentencia SELECT consta de cuatro partes básicas:

  • La cláusula SELECT seguida de la descripción de lo que se desea ver, los nombres de las columnas a seleccionar. Esta parte es obligatoria.
  • La cláusula FROM seguida de la especificación de las tablas de las que se han de obtener los datos. Esta parte es obligatoria.
  • La cláusula WHERE seguida por un criterio de selección, una condición. Esta parte es opcional.
  • La cláusula ORDER BY seguida por el criterio de ordenación. Esta parte es opcional.

Es importante señalar que para seleccionar datos desde una tabla o vista el usuario debe tener permisos sobre esta.

La sintaxis de la sentencia SELECT es la siguiente:

SELECT [distinct | all] {*  | column_mame [c_alias], column_mame [c_alias]…} 

FROM  {tabla [t_alias], tabla [t_alias]…} 

WHERE  condition

HAVING condition

GROUP BY  { column_mame, column_mame …}

ORDER BY  { column_mame [asc|desc], column_mame [asc|desc]…}

Distinct                        Retorna solo una ocurrencias de los valores de una  columna

All                                Retorna todas las ocurrencias de los registros seleccionados.

El valor por defecto de un select es el all.

*                                  Selecciona todas las columnas de una tabla o vista.

column_mame             Nombre de la columna de la tabla o vista.

C_alias                        Sobrenombre  de columna.

Table_name                Nombre de la tabla o vista.

T_alias                        Sobrenombre de la tabla o vista utilizada

Condition                    Condición que se debe cumplir para retornar resultados.

Asc                              Ordena de forma ascendente los registros seleccionados.

Desc                            Ordena de forma descendente los registros seleccionados.

Selección de Columnas:

Las columnas a seleccionar se enumeran sin más en la cláusula SELECT. Si se desea seleccionar todas las columnas de una tabla se puede hacer enumerando a todas las columnas o colocando un asterisco, *, en su lugar.

Cuando se consulta una base de datos, los nombres de las columnas se usan como cabeceras de presentación. Si éste resulta demasiado largo, corto o críptico, puede cambiarse con la misma sentencia SQL de consulta, creando un alias de columna.

SQL> select dname «Departamento», loc «Está en» from dept;
Departamento   Esta en
————– ————-
ACCOUNTING     NEW YORK
RESEARCH       DALLAS
SALES          CHICAGO
OPERATIONS     BOSTON

Cláusula FROM

La cláusula FROM define las tablas de las que se van a seleccionar las columnas.

Se puede añadir al nombre de las tablas el usuario propietario de las mismas de la forma usuario.tabla. De esta manera podemos distinguir entre las tablas de un usuario y otro. Oracle siempre considera como prefijo el nombre del propietario de las tablas, aunque no se lo indiquemos. De esta forma dos o más usuarios pueden tener tablas que se llamen igual sin que surjan conflictos. Si quisiéramos acceder a las filas de la tabla dept del usuario scott, (además de tener privilegios de lectura sobre esa tabla) deberíamos escribir la siguiente sentencia SQL:

SQL> select * from scott.dept;

También se puede asociar un alias a las tablas para abreviar los nombres de las tablas. Un ejemplo se puede ver en la sentencia SQL siguiente:

SQL> select d.dname from dept d;

Cláusula WHERE

Hasta ahora hemos visto como puede utilizarse la sentencia SELECT para recuperar todas las columnas o un subconjunto de ellas de una tabla. Pero este efecto afecta a todas las filas de la tabla, a menos que especifiquemos algo más en la cláusula WHERE. Es aquí donde debemos proponer la condición que han de cumplir todas las filas para salir en el resultado de la consulta. La complejidad del criterio de búsqueda es prácticamente ilimitada, y en él se pueden conjugar operadores de diversos tipos con funciones de columnas, componiendo expresiones más o menos complejas.

Operadores de Comparación

Operador Operación Ejemplo
= Igualdad select * from emp where deptno = 10;
!=, <>, ^= Desigualdad select * from emp where deptno != 10;
< Menor que select * from emp where deptno  < 10;
> Mayor que select * from emp where deptno  > 10;
<= Menor o igual que select * from emp where deptno <= 10;
>= Mayor o igual que select * from emp where deptno >= 10;
in Igual a cualquiera de los miembros entre paréntesis select * from emp where deptno in (10, 30);
Not in Distinto a cualquiera de los miembros entre paréntesis select * from emp where deptno not in (10,30);
between Contenido en el rango select * from emp where empno between 1 and 1000;
Not between Fuera del rango select * from emp where empno not between 1 and 1000;
like ‘_abc%’ Contiene la cadena ‘abc’ a partir del segundo carácter y luego cualquier cadena de caracteres select * from emp where job like ‘MA%’;

Operadores de Aritméticos

Operador Operación Ejemplo
+ Suma select ename, sal+comm from emp where job=’SALESMAN’;
Resta select ename from emp where sysdate-hiredate > 365;
* Producto select ename, sal *12 from emp;
/ División select ename, sal /31 from emp;

Operadores de Cadenas de Caracteres

Operador Operación Ejemplo
|| Concatenación select ename||’ – ‘||job from emp;

Cláusula ORDER BY

Se utiliza para especificar el criterio de ordenación de la respuesta a la consulta. Por defecto la ordenación es ascendente, aunque se puede especificar un orden descendente. La ordenación se puede establecer sobre el contenido de columnas o sobre expresiones con columnas. A continuación se puede ver un ejemplo de uso de la cláusula ORDER BY en la que quiere obtener un listado de los empleados ordenado de manera descendente por su salario y en caso de igualdad de salario, ordenado ascendentemente por su nombre.

SQL> select ename, sal from emp order by sal desc, ename

ENAME            SAL

———- ———

KING            5000

FORD            3000

SCOTT           3000

JONES           2975

BLAKE           2850

CLARK           2450

TURNER          1500

MILLER          1300

ADAMS           1100

JAMES            950

10 rows selected.

Cláusula DISTINCT

Cuando se realiza una consulta sobre una tabla en la que se extrae información de varias columnas, puede ocurrir que, si no incluimos la/s columna/s que forman la clave principal, obtengamos filas repetidas en la respuesta.

Si este comportamiento no nos resulta satisfactorio podemos utilizar la cláusula DISTINCT para eliminar las filas duplicadas obtenidas como respuesta a una consulta.

Podemos ver como funciona en el siguiente ejemplo, en el que preguntamos por los distintos oficios de nuestros empleados.

SQL> select distinct job from emp;

JOB

———

ANALYST

CLERK

MANAGER

PRESIDENT

SALESMAN 

Funciones de SQL:

Existen en SQL muchas funciones que pueden complementar el manejo de los datos en las consultas. Se utilizan dentro de las expresiones y actúan con los valores de las columnas, variables o constantes.

Se pueden incluir en las cláusulas SELECT, WHERE y ORDER BY.

Pueden anidarse funciones dentro de funciones. Y existe una gran variedad de funciones para cada tipo de datos:

  • Aritméticas,
  • de Cadenas de Caracteres,
  • de Manejo de Fechas,
  • de Conversión,
  • de Grupo.
  • Otras,

Funciones Aritméticas

Función Cometido Ejemplo Resultado
ABS(n) Calcula el valor absoluto de n. select abs(-15) from dual; 15
CEIL(n) Calcula el valor entero inmediatamente superior o igual a n. select ceil(15.7) from dual; 16
Floor(n) Calcula el valor entero inmediatamente inferior o igual a n. select floor(15.7) from dual; 15
MOD(m,n) Calcula el resto resultante de dividir m entre n. select mod(11,4) from dual; 3
POWER(m,n) Calcula la potencia n-esima de m. select power(3,2) from dual; 9
ROUND(m,n) Calcula el redondeo de m a n decimales. Si n<0 el redondeo se efectúa a por la izquierda del punto decimal. select round(123.456,1) from dual; 123.5
SQRT(n) Calcula la raíz cuadrada de n. select sqrt(4) from dual; 2
TRUNC(m,n) Calcula m truncado a n decimales (n puede ser negativo). select trunc(123.456,1) from dual; 123.4
SIGN(n) Calcula el signo de n, devolviendo -1 si n<0, 0 si n=0 y 1 si n>0. select sign(-12) from dual; -1

Funciones de Cadenas de Caracteres

Función Cometido Ejemplo Resultado
CHR(n) Devuelve el carácter cuyo valor codificado es n. select chr(65) from dual; A
ASCII(cad) Devuelve el valor ascii de cad. select ascii('A') from dual; 65
CONCAT(cad1,cad2) Devuelve cad1 concatenada con cad2. Esta función es equivalente al operador ||. select concat(concat(nombre,' es '),oficio) from emp; Cano es Presidente, etc.
LOWER(cad) Devuelve la cadena cad con todas sus letras convertidas a minúsculas. select lower('MinUsCulAs') from dual; minúsculas
UPPER(cad) Devuelve la cadena cad con todas sus letras convertidas a mayúsculas. select upper('maYuSCulAs') from dual; MAYUSCULAS
INITCAP(cad) Devuelve cad con el primer caracter en mayúsculas. select initcap('isabel') from dual; Isabel
LPAD(cad1,n,cad2)RPAD(cad1,n,cad2) Devuelve cad1 con longitud n, y ajustada a la derecha, rellenando por la izquierda con cad2. select lpad('P',5,'*') from dual; ****P
TRIM(cad)LTRIM (cad)RTRIM(cad) Devuelve cad1 sin los espacios (izquierda o derecha) select ltrim (' Espacio ‘) from dual;   Espacio
REPLACE(cad,ant,nue) Devuelve cad en la que cada ocurrencia de la cadena ant ha sido sustituida por la cadena nue. select replace('digo','i','ie') from dual; diego
SUBSTR(cad,m,n) Devuelve la subcadena de cad compuesta por n caracteres a partir de la posicion m. select substr('ABCDEFG',3,2) from dual; CD
INSTR(cad1, cad2, n1, n2) Devuelve la posición donde se encuentra la cad2 dentro de la cad1 a partir de la posición n1 y la ocurrencia n2. select INSTR('AAABBBDDDBBBAAA', 'BBB', 3, 2) FROM DUAL; 10
LENGTH(cad) Devuelve la longitud de cad. select length('cadena') from dual; 6


Funciones de Manejo de Fechas

Función Cometido Ejemplo Resultado
SYSDATE Devuelve la fecha y hora actuales. select sysdate from dual; 14-MAR-97
ADD_MONTHS(d,n) Devuelve la fecha d incrementada en n meses. select add_months(sysdate,4) from dual; 14-JUL-97
LAST_DAY(d) Devuelve la fecha del último día del mes de d. select last_day(sysdate) from dual; 31-MAR-97
MONTHS_BETWEEN(d1, d2) Devuelve la diferencia en meses entre las fechas d1 y d2. select months_between(sysdate,'01-JAN-97') from dual; 2.43409424
NEXT_DAY(d,cad) Devuelve la fecha del primer día de la semana cad después de la fecha d. select next_day(sysdate, 'sunday') from dual; 16-MAR-97

Funciones de Conversión de Tipos

Función Cometido Ejemplo Resultado
TO_NUMBER(cad,fmto) Convierte la cadena cad a un número, opcionalmente de acuerdo con el formato fmto. select to_number('12345') from dual; 124345
TO_CHAR(d, fmto) Convierte la fecha d a una cadena de caracteres, opcionalmente de acuerdo con el formato fmto. select to_char(sysdate) from dual; ’14-MAR-97′
TO_DATE(cad,fmto) Convierte la cadena cad de tipo varchar2 a fecha, opcionalmente de acuerdo con el formato fmto. select to_date('1-JAN-97') from dual; 01-JAN-97

Con las fechas pueden utilizarse varios formatos. Estos formatos permiten modificar la presentación de una fecha. En la siguiente tabla se presentan algunos formatos de fecha y el resultado que generan.

Máscaras de Formato Numéricas

Formato Cometido Ejemplo Resultado
cc ó scc Valor del siglo. select to_char(sysdate,'cc') from dual; 20
y,yyy ó sy,yyy Año con coma, con o sin signo. select to_char(sysdate,'y,yyy') from dual; 1,997
yyyy ó yyy ó yy ó y Año sin signo con cuatro, tres, dos o un dígitos. select to_char(sysdate,'yyyy') from dual; 1997
q Trimestre. select to_char(sysdate,'q') from dual; 1
ww ó w Número de la semana del año o del mes. select to_char(sysdate,'ww') from dual; 11
mm Número del mes. select to_char(sysdate,'mm') from dual; 03
ddd ó dd ó d Número del día del año, del mes o de la semana. select to_char(sysdate,'ddd') from dual; 073
hh ó hh12 ó hh24 La hora en formato 12h. o 24h. select to_char(sysdate,'hh') from dual; 12
mi Los minutos de la hora. select to_char(sysdate,'mi') from dual; 15
ss ó sssss Los segundos dentro del minuto, o desde las 0 horas. select to_char(sysdate,'sssss') from dual; 44159

 

Máscaras de Formato de Caracteres

Formato Cometido Ejemplo Resultado
Syear ó year Año en Inglés select to_char(sysdate,'syear) from dual; nineteen ninety-seven
month o mon Nombre del mes o su abreviatura de tres letras. select to_char(sysdate,'month') from dual; march
day ó dy Nombre del día de la semana o su abreviatura de tres letras. select to_char(sysdate,'day') from dual; friday
a.m. ó p.m. El espacio del día. select to_char(sysdate,'a.m.') from dual; p.m.
b.c. ó a.d. Indicador del año respecto al del nacimiento de Cristo. select to_char(sysdate,'b.c.') from dual; a.d.

Otras Funciones

Función Cometido Ejemplo Resultado
DECODE(var, val1, cod1, val2, cod2, …, defecto) Convierte el valor de var, de acuerdo con la codificación. select JOB,decode(JOB, 'PRESIDENT','P','MANAGER','M','X') from emp; P, D, X, …
GREATEST(exp1, exp2, …) Devuelve el mayor valor de una lista. SELECT GREATEST(1,2,4,33,4,45,6,56) FROM DUAL; 56
LEAST(cad,fmto) Devuelve el menor valor de una lista. SELECT LEAST(1,2,4,33,4,45,6,56) FROM DUAL; 1
NVL(val, exp) Devuelve la expresión exp si val es NULL, y val si en otro caso. select sal+nvl(comm,0) from emp; 450000, 350000, …

Cláusula GROUP BY

SQL nos permite agrupar las filas resultado de una consulta en conjuntos y aplicar funciones sobre esos conjuntos de filas.

La sintaxis es la siguiente:

SELECT {* | {columna,}+}

FROM {tabla,}+

WHERE condición

GROUP BY {columna ,}+

HAVING condición

ORDER BY {expresiónColumna [ASC | DESC],}+;

En la cláusula GROUP BY se colocan las columnas por las que vamos a agrupar. Y en la cláusula HAVING se especifica la condición que han de cumplir los grupos para pasar al resultado.

La evaluación de las diferentes cláusulas en tiempo de ejecución se efectúa en el siguiente orden:

  • WHERE filtra las filas
  • GROUP BY crea una tabla de grupo nueva
  • HAVING filtra los grupos
  • ORDER BY clasifica la salida

Un ejemplo de utilización de la selección de grupos puede ser seleccionar los empleados agrupados por su oficio. Un primer intento de consulta es el siguiente:

SQL> select ename, job from emp group by job;

select ename, job from emp group by job

       *

ERROR at line 1:

ORA-00979: not a GROUP BY expression

Se presenta un error debido a que cuando se utiliza GROUP BY, las columnas implicadas en el SELECT y que no aparezcan en la cláusula GROUP BY deben tener una función de agrupamiento. En otras palabras, la columna nombre debe tener una función de agrupamiento que actue sobre ella (max, min, sum, count, avg). Si no puede ser así, deberá llevar dicha columna a la cláusula GROUP BY.

De nuevo, el ejemplo quedará así:

SQL> select count(ename), job from emp group by job;

COUNT(ENAME) JOB

———— ———

           2 ANALYST

           3 CLERK

           3 MANAGER

           1 PRESIDENT

           1 SALESMAN

Para condicionar  basados en grupo utilizando HAVING:

SQL> select count(ename), job from emp group by job

  2  having count(ename) >= 2 order by 1 desc;

 COUNT(ENAME) JOB

———— ———

           3 CLERK

           3 MANAGER

           2 ANALYST

 Las funciones de agrupamiento que se pueden utilizar son las siguientes.

Funciones de Agrupamiento

Función Cometido Ejemplo
COUNT(col) Cuenta el número de filas agrupadas. select count(ename),job from emp group by job;
AVG(col) Calcula el valor medio de todos los valores de la columna col. select avg(sal),job from emp group by job;
MAX(col) Calcula el valor máximo de todos los valores de la columna col. select max(sal),job from emp group by job;
MIN(col) Calcula el valor mínimo de todos los valores de la columna col. select min(sal),job from emp group by job;
SUM(col) Calcula la suma de los valores de la columna col. select sum(sal),job from emp group by job;
STDDEV(col) Calcula la desviación típica de los valores de la columna col sin tener en cuenta los valores nulos. select stddev(sal),job from emp group by job;
VARIANCE(col) Calcula la varianza de los valores de la columna col sin tener en cuenta los valores nulos. select variance(sal),job from emp group by job;

Hay que tener en cuenta que los valores nulos no participan en el cálculo de las funciones de conjuntos. Estas funciones se pueden utilizar con las cláusulas DISTINCT y ALL. También se pueden utilizar aunque no realicemos agrupación alguna en la consulta, considerando a toda la tabla como un grupo.

SQL> select count(*) from emp;

  COUNT(*)

———-

        10

Expresiones con Sentencias Select

El resultado de cada consulta es un conjunto de filas. Y con conjuntos se pueden realizar tres operaciones típicas: la unión, la intersección y la diferencia.

Unión, UNION

Combina todas las filas del primer conjunto con todas las filas del segundo. Cualquier fila duplicada se reducirá a una sola.

Intersección, INTERSECT

Examinará las filas de los conjuntos de entrada y devolverá aquellas que aparezcan en ambos. Todas las filas duplicadas serán eliminadas antes de la generación del conjunto resultante.

Diferencia, MINUS

Devuelve aquellas filas que están en el primer conjunto pero no en el segundo. Las filas duplicadas del primer conjunto se reducirán a una fila única antes de empezar la comparación con el segundo conjunto.

Reglas para el Manejo de los Operadores de Conjuntos:

  • Pueden ser encadenados en cualquier combinación, siendo evaluados de izquierda a derecha.
  • No existe jerarquía de precedencia en el uso de estos operadores, pero puede ser forzada mediante paréntesis.
  • Pueden ser empleados con conjuntos de diferentes tablas siempre que se apliquen las siguientes reglas:
    • Las columnas son relacionadas en orden, de izquierda a derecha.
    • Los nombres de las columnas son irrelevantes.
  • Los tipos de datos deben coincidir.

Como ejemplo podemos consultar sobre todos los nombres de empleado que trabajan para los departamentos 10 o 30. Esto se consigue restando a todos los nombres de empleados, aquellos que están en el departamento 20.

SQL> select ename from emp

  2  minus

  3  select ename from emp where deptno =20;

ENAME

———-

BLAKE

CLARK

JAMES

KING

MILLER

TURNER

6 rows selected.

Combinaciones

Hasta ahora hemos construido consultas con una única tabla, pero esto no debe ser siempre así.

De hecho, sólo se alcanza la verdadera potencia del SQL cuando combinamos el contenido de más de una tabla.

Supongamos que queremos conseguir una lista con los empleados y los departamentos para los que trabajan. Esta información está repartida en las dos tablas que tenemos, emp y dept. Así, podríamos intentar una consulta que seleccionara el campo nombre de la tabla emp y el nombre del departamento. Y aquí surge el primer problema, ¿cómo distinguimos entre dos columnas que llamándose igual, pertenecen a tablas distintas? Para eso se utiliza como prefijo o el nombre de la tabla (dept.nombre) o un alias de tabla, un nombre que se asocia a cada tabla y se coloca como prefijo a la columna (d.nombre).

Realicemos la consulta …

SQL> select e.ename, d.dname from emp e, dept d;

ENAME      DNAME

———- ————–

KING       ACCOUNTING

JONES      ACCOUNTING

BLAKE      ACCOUNTING

CLARK      ACCOUNTING

SCOTT      ACCOUNTING

TURNER     ACCOUNTING

ADAMS      ACCOUNTING

JAMES      ACCOUNTING

FORD       ACCOUNTING

……

El resultado puede sorprender un poco. Lo que obtenemos es el producto cartesiano de todos los empleados por todos los departamentos. SQL ha cogido cada fila de la tabla emp y le ha asociado todos los dept de la tabla Dept..

Para conseguir lo que queremos tenemos que forzar que se asocie a un empleado con el nombre del departamento para el que trabaja. Y esto se puede hacer si añadimos la condición de que el deptno tenga el mismo valor en la fila de la tabla emp que en la fila escogida de la tabla dept:

SQL> select e.ename, d.dname from emp e, dept d

  2  where e.deptno = d.deptno;

ENAME      DNAME

———- ————–

KING       ACCOUNTING

JONES      RESEARCH

BLAKE      SALES

CLARK      ACCOUNTING

SCOTT      RESEARCH

TURNER     SALES

ADAMS      RESEARCH

JAMES      SALES

FORD       RESEARCH

MILLER     ACCOUNTING

10 rows selected.

De la misma manera se pueden combinar más de dos tablas. Lo importante es emparejar los campos que han de tener valores iguales.

Reglas de Combinación:

  • Pueden combinarse tantas tablas como se desee.
  • El criterio de combinación puede estar formado por más de una pareja de columnas.
  • En la cláusula SELECT pueden citarse columnas de ambas tablas, condicionen o no la combinación.
  • Si hay columnas con el mismo nombre en las distintas tablas, deben identificarse especificando la tabla de procedencia o utilizando un alias de tabla.

Existe un tipo especial de combinación llamada Combinación Externa. Suponga que se crea un nuevo departamento, (insert into dept values (80,’Distribucion’,’Barahona’);) pero todavía no hemos asignado personal al mismo. Si realizamos la consulta anterior, el nuevo departamento no aparecerá en la respuesta. Pero esto se puede evitar si señalamos en la cláusula WHERE la posibilidad de que en la tabla de empleados no existan algunos de los códigos de departamento que si exista en la tabla de departamentos. Esto se hace colocando un (+) de la siguiente manera:

SQL> select e.ename, d.dname

  2  from emp e, dept d

  3  where e.deptno(+)=d.deptno;

ENAME      DNAME

———- ————–

KING       ACCOUNTING

CLARK      ACCOUNTING

MILLER     ACCOUNTING

JONES      RESEARCH

SCOTT      RESEARCH

ADAMS      RESEARCH

FORD       RESEARCH

BLAKE      SALES

JAMES      SALES

TURNER     SALES

           OPERATIONS

11 rows selected.

SubConsultas:

A veces se han de utilizar en una consulta los resultados de otra consulta, llamada subconsulta.

Un ejemplo de esto ocurre cuando queremos conocer los nombres de los empleados cuyo salario está por encima de la media:

SQL> select ename,sal from emp

  2  where sal > (select avg(sal) from emp);

ENAME

———-

KING

JONES

BLAKE

CLARK

SCOTT

FORD

La consulta más interna calcula el salario medio, y la consulta más externa lo utiliza para seleccionar los nombres que ganan más que la media.

El valor de comparación puede ser un valor simple, como en el ejemplo anterior, o un conjunto de valores. Hay que tener en cuenta este detalle ya que el tipo de operador a utilizar varía. En el primer caso se puede utilizar un operador de comparación de carácter aritmético (<, >, etc.). Y en el segundo uno de tipo lógico (IN).

Las subconsultas pueden devolver más de una columna, y se habrán de comparar de manera consecuente:

  • Las columnas de la cláusula WHERE de la consulta principal deben estar agrupadas por paréntesis.
  • Las columnas encerradas entre paréntesis deben coincidir en número y tipo de datos con los datos que devuelve la subconsulta.
  • El nivel de anidamiento de subconsultas es ilimitado.

Se puede utilizar una subconsulta para insertar valores en una tabla en el momento de la creación de la misma con la cláusula AS. Si quisiéramos crear una tabla con los datos de los empleados del departamento 10 lo podríamos hacer de la siguiente manera:

SQL> create table dep10 (ename, job, deptno)

  2  as select ename, job, deptno from emp

  3  where deptno = 10;

Table created.

Se puede utilizar su consulta a nivel de las columnas del SELECT:

SQL> select ename, job,

  2   (select dname from dept where deptno = e.deptno) depto

  3  from emp e;

ENAME      JOB       DEPTO

———- ——— ————–

KING       PRESIDENT ACCOUNTING

JONES      MANAGER   RESEARCH

BLAKE      MANAGER   SALES

CLARK      MANAGER   ACCOUNTING

SCOTT      ANALYST   RESEARCH

TURNER     SALESMAN  SALES

ADAMS      CLERK     RESEARCH

JAMES      CLERK     SALES

FORD       ANALYST   RESEARCH

MILLER     CLERK     ACCOUNTING

No es necesario especificar tipos ni tamaños de las columnas, ya que vienen determinados por los tipos y tamaños de las columnas recuperadas en la subconsulta.

Clausula EXISTS:

Otra manera de emplear su consulta es la clausula EXISTS que permite evaluar el resultado de otro query o subconsulta.

SQL> select deptno, dname from dept d

  2  where exists (select 1 from emp

  3                where deptno = d.deptno

  4                and   sal   >= 1000);

   DEPTNO DNAME

——— ————–

       10 ACCOUNTING

       20 RESEARCH

       30 SALES

Tambien se puede negar la condicion o la no existencia:

SQL> select deptno, dname from dept d

  2  where NOT exists (select 1 from emp

  3                    where deptno = d.deptno

  4                    and   sal   >= 1000);

   DEPTNO DNAME

——— ————–

       40 OPERATIONS

Creación de Vistas:

Create View:

Las vistas son objetos utilizados solo para la consulta de datos. Su uso se fundamenta en agrupar informaciones de diferentes tablas y facilitar las consultas.

Sintaxis:

            CREATE VIEW view_name(column_name, column_name, …) AS Select;

            view_name                  Nombre de la vista a crear.

            column_name              Nombre de columnas.

            Select                           Select de donde saldran los datos

SQL> create view empleados_v (codigo, nombre, salario, cargo)

  2  as select empno, ename, sal, job from emp;

View created.

SQL> desc empleados_v

 Name                            Null?    Type

 ——————————- ——– —-

 CODIGO                          NOT NULL NUMBER(4)

 NOMBRE                                   VARCHAR2(10)

 SALARIO                                  NUMBER(7,2)

 CARGO                                    VARCHAR2(9)

Renombrando Objetos:

RENAME

El comando RENAME se utiliza para modificar el nombre de uno objeto, tabla, vista o sinónimo.

La sintaxis es la siguiente

               RENAME {tabla | vista | sinónimo} to nuevoNombre ;

Esta sentencia cambiará el nombre antiguo por el nuevo, y a partir de este momento cualquier acceso al objeto por el nombre antiguo será respondido con un mensaje de error. Conviene resaltar la diferencia entre el comando SYNONYM y el comando RENAME. Mientras que el primero mantiene el nombre original para acceder al objeto, el segundo elimina ese primer nombre sustituyéndolo por el nuevo.

SQL> Rename empleados to empleado;

EJERCICIO III

1)      Insertar 5 registros en cada una de las siguientes tablas:

  • Materias
  • Estudiantes
  • Notas

2)      Borrar los registros de las tablas Materia y Estudiantes que no tengan registros relacionados en la tabla de Notas.

3)      Hacer consulta relacionando las tablas Materia, Estudiantes y Notas y utilizar la cláusula ORDER BY y luego convertirla en una vista con los siguientes campos:

Columna       Tabla

————– ———–

MATRICULA      NOTAS

NOMBRE         ESTUDIANTES

MATERIA       NOTAS

NOM_MATERIA    MATERIAS

CALIFICACION   NOTAS

septiembre 28, 2009 Posted by | Oracle | Deja un comentario

Curso Basico de SQL (Capitulo III)

CAPITULO III – SENTENCIAS DML

Creación De Sinónimos: 

Los objetos de Base de Datos pertenecen a usuarios y cuando son de otros usuarios para verlos se necesitan permisos y referirlos con el nombre del usuario (dueño), un punto y luego el nombre del objeto (USUARIO.NOMBRE_OBJETO). Para evitar esto nos asistimos de los sinónimos, los cuales pueden ser publicos o privados.

Sintaxis:

            CREATE [PUBLIC] SYNONYM synonym_name FOR user.table_name;

            Synonym_name           Nombre del sinónimo.

            User                            Nombre del usuario dueño de la tabla.

            Table_name                Nombre de la Tabla a la que se le hace el sinónimo.

Los sinonimos publicos estan disponible para todos los usuarios, los privados solo para el usuario que los creo. Se puede tener ambos, en este caso oracle utiliza primero el privado.

Ejemplos:

1)      Veamos a crear un sinónimo privado de la tabla ciudades del usuario scott.

SQL> DESC scott.cities

Name                            Null?    Type

——————————- ——– —-

STATE                                    VARCHAR2(2)

CITY                                     VARCHAR2(25)

POPULATION                               NUMBER(8)

WHITE                                    NUMBER(6,2)

BLACK                                    NUMBER(6,2)

HISPANIC                                 NUMBER(6,2)

ASIAN                                    NUMBER(6,2)

OTHER                                    NUMBER(6,2)

CREATE SYNONYM cities FOR scott.cities;           

SQL> DESC cities

Name                            Null?    Type

——————————- ——– —-

STATE                                    VARCHAR2(2)

CITY                                     VARCHAR2(25)

POPULATION                               NUMBER(8)

WHITE                                    NUMBER(6,2)

BLACK                                    NUMBER(6,2)

HISPANIC                                 NUMBER(6,2)

ASIAN                                    NUMBER(6,2)

OTHER                                    NUMBER(6,2)

 2)      Este comando crea un sinónimo público de la tabla item del usuario scott.

 CREATE PUBLIC SYNONYM item FOR scott.item;

Creación De Índice a Tablas  

El acceso a los datos de las tablas en oracle es bastante rápido, pero cuando la tabla es grande es necesario utilizar índice para optimizar estos accesos. Los índices nos permiten el acceso rápido de la data de una tabla, siempre y cuando estos sean usados correctamente. Se debe estar consciente de los índices que se crean, ya que estos ocupan muchos espacios de almacenamiento en disco y si no se definen adecuadamente en vez de ayudar nos perjudican.

Oracle crea un índice implícito por cada Primary Key, si se tiene un modelo de data normalizado a lo mejor  se tenga que crear muy pocos índices en adición a los creados por los PK.

            CREATE [UNIQUE] INDEX index_name

            ON table_name (column_name [ASC|DESC], column_name [ASC|DESC],….)

            Index_name                 Nombre del índice a crear.

            Unique                                    Unico, los valores del índice no se repiten.

            table_name                  Nombre de la Tabla a la que se le hace el índice.

            column_name              Nombre de columna por la que se ordenará el índice.

            Asc|Desc                     Para ordenar el índice de manera ascendente o

Descendente por columna. El default es Asc.

Ejemplos:

1)        Crea el índice nom_estudiantes a la tabla de estudiantes por la columna nombre en forma ascendente.

CREATE INDEX nom_estudiante ON estudiantes (nombre asc);

2)        Crea el índice calif_notas a la tabla de notas por las columnas materia descendente y matricula ascendente.

CREATE INDEX calf_notas ON notas (materia desc,matricula  asc)

Eliminación de Objetos:

La sentencia DROP elimina de manera definitiva un objeto de la Base de Datos.

Drop Table:

Una tabla se puede borrar si no tiene ninguna tabla que dependa de ella. En el caso que existan dependencias (hijos) se deben borrar primero los hijos y luego la tabla (padre), al menos que se  utilice la cláusula CASCADE CONSTRAINT que borra todas las relaciones de la tabla; el uso de esta cláusula no es recomendada al menos que se esté seguro de lo que se hace.

Sintaxis:

            DROP TABLE tabla [CASCADE CONSTRAINT];

Tabla                                       Nombre de la tabla a borrar.

CASCADE CONSTRAINT     Borra la tabla y sus relaciones con otras tablas.

Ejemplos:

1)      Borra la tabla de materias.

DROP TABLE materias;

            No se pudo borrar porque la tabla de notas depende de ella.

2)      Borra la tabla de materias  con todas sus relaciones.

DROP TABLE materias CASCADE CONSTRAINT;

Drop Index:

Este comando se utiliza para borrar los índices de las tablas. Estos no se modifican, se eliminan y se vuelven a crear. Al borrar una tabla automáticamente borra los índices de ésta.

Sintaxis:

            DROP INDEX índice;

            Índice                          Nombre del Índice a borrar.

 Ejemplos:

 1)  Borra el índice nom_estudiante de la tabla estudiantes.

             DROP INDEX nom_estudiante;

 Drop Synonyms:

Para Eliminar sinónimos. Los sinónimos son objetos independientes, no dependen de las tablas.

DROP [PUBLIC] SYNONYM sinónimo;

Sinónimo                     Nombre de sinónimo a borrar. 

Nota:  si el sinónimo es public se debe emplear la cláusula PUBLIC.

 

Ejemplos:

1)  Borra el sinónimo privado  cities creado a la tabla cities del usuario scott.

                 DROP SYNONYM cities;

                 Si el sinónimo es público seria:       

                 DROP PUBLIC SYNONYM cities;

 Truncando Tablas:

Truncate Table

Esta es una manera  rápida de borrar una tabla. Este comando es muy peligroso, se debe tener mucho cuidado con su uso, ya que a diferencia del DELETE, UPDATE, INSERT que necesitan del COMMIT para grabar definitivamente la información; este graba automáticamente.

Sintaxis:

            TRUNCATE  TABLE  Table_name;

Ejemplo:        

Para borrar todos los registros de la tabla deptos :

            TRUNCATE TABLE deptos;

EJERCICIO I

1)      Crear un índice llamado nom_empleados_ind a la tabla de EMPLEADOS por  el nombre del empleado.

2)      Crear un índice fk2_trans_emplados a la tabla de TRANS_X_EMPLEADOS  por el código del empleado.

3)      Crear un índice sec_transaccion_ind de la tabla TRANS_X_EMPLEADOS sobre las columnas secuencia de transacción de forma descendente y  fecha de transacción ascendente.

4)      Borrar el  índice calif_notas de la tabla NOTAS.

5)      Borrar las tablas NOTAS Y ESTUDIANTES.

6)      Borrar el índice sec_transaccion_ind de la tabla TRANS_X_EMPLEADOS.

septiembre 28, 2009 Posted by | Database | Deja un comentario

Curso Basico de SQL (Capitulo II)

CAPITULO II – SENTENCIAS DML

 Las sentencias SQL pertenecen a dos categorías principales: Lenguaje de Definición de Datos, DDL y Lenguaje de Manipulación de Datos, DML. Estos dos lenguajes no son lenguajes en sí mismos, sino que es una forma de clasificar las sentencias de lenguaje SQL en función de su cometido. La diferencia principal reside en que el DDL define objetos en la base de datos y sus efectos se pueden ver en el diccionario de datos; mientras que el DML es el que permite consultar, insertar, modificar y eliminar la información almacenada en los objetos de la base de datos.

Cuando se ejecutan las sentencias DDL de SQL, el SGBD o RDBMS confirma la transacción actual antes y después de cada una de las sentencias DDL. En cambio, las sentencias DML no llevan implícito el commit y se pueden deshacer. Existe pues un problema al mezclar sentencias DML con DDL, ya que estas últimas pueden confirmar las primeras de manera involuntaria e implícita, lo que en ocasiones puede ser un problema.

A continuación se presenta una tabla con las sentencias SQL más comunes, clasificadas según el lenguaje al que pertenecen.

Sentencias DDL Objetivo
Create Crear objetos de Base de Datos.
Alter Cambiar objetos de Base de Datos.
Drop Eliminar objetos de Base de Datos.
Truncate Eliminar todas las filas de una tabla.
Grant Conceder privilegios o papeles, roles, a un usuario o a otro rol.
Revoke Retirar los privilegios de un usuario o rol de la base de datos.
Sentencias DML Objetivo
Insert Añadir filas de datos a una tabla.
Delete Eliminar filas de datos de una tabla.
Update Modificar los datos de una tabla.
Select Recuperar datos de una tabla.
Commit Confirmar como permanentes las modificaciones realizadas.
Rollback Deshacer todas las modificaciones realizadas desde la última confirmación.
Savepoint Puntos de savamento de transacciones.

Sentencias DDL:

La primera fase de cualquier base de datos comienza siempre con sentencias DDL, ya que antes de poder almacenar información debemos definir los objetos básicos donde agrupar la información. Los objetos básicos con que trabaja SQL son las tablas. Una tabla es un conjunto de celdas agrupadas en filas y columnas donde se almacenan elementos de información.

Antes de llevar a cabo la creación de una tabla conviene planificar:

  • nombre de la tabla,
  • nombre de cada columna,
  • tipo y tamaño de los datos almacenados en cada columna,
  • información adicional, restricciones, índices, llaves, etc.

Hay que tener en cuenta también ciertas restricciones en la formación de los nombres de las tablas: longitud máxima de 30 caracteres, no puede haber nombres de tabla duplicados, deben comenzar con un carácter alfabético, permitir caracteres alfanuméricos y el guión bajo ‘_’, y Oracle no distingue entre mayúsculas y minúsculas.

Creación de Tablas:
Create Table: sentencia utilizada para la creación de tablas:

Sintaxis:

            CREATE  TABLE  table_name

            ( {culumn_name datatype [c_constraints]}, culumn_name datatype [c_constraints]},…,

                 [T_constraints]);                                                                                                                                                            

Table_name                Nombre de la tabla.

Column_name             Nombre de la columna.

Data type                     Tipo de Dato.

C_constraints              Restricciones de la Columna.

T_constraints               Restricciones de la Tabla.

 Existen varios tipos de datos en SQL. De esta manera, cada columna puede albergar una información de naturaleza distinta. Los tipos de datos más comunes y sus características se resumen en la siguiente tabla.

CHAR(n).

Datos de tipo carácter, de n caracteres de longitud. La cantidad máxima permitida es de 255.
DATE Rango válido de fecha desde el 1 de enero 4712 AC

Hasta el 31 de diciembre del 4712 DC.

LONG

Dato de tipo carácter con tamaño variable hasta 65535 caracteres, solo se puede definir una columna LONG por tabla. Estas no se pueden utilizar en subconsultas, funciones, expresiones, cláusulas WHERE o índices.
RAW(n) Datos binarios con una longitud de n bytes. El tamaño máximo es de 255 bytes.
LONG RAW Datos binarios puros. Por lo demás igual a LONG

NUMBER

Numero de 40 dígitos.
NUMBER(n) Numero de n dígitos.
NUMBER(n,d) Numero de n dígitos con d cifras a la derecha del punto decimal.
VARCHAR2(n) Cadena de caracteres de longitud variable hasta n caracteres.

Ejemplos Creación de Tablas:

1)      Tabla simple con restricciones a nivel de tabla.

CREATE TABLE materias

    (MATERIA       NUMBER(2),

     NOM_MATERIA   VARCHAR2(35),

     CREDITOS      NUMBER(2),

     CONSTRAINT pk_materias PRIMARY KEY (materia)

    );

Al definir una columna como PK (Primary Key o llave primaria) automáticamente adquiere la restricción  NOT NULL y  crea un ÍNDICE por esa columna. El nombre del PK (pk_materia) definido al crear la tabla es el que usara oracle para almacenarlo en la base de datos. Las llaves primarias pueden estar compuestas por 1 o mas columnas de la tabla y solo se permite uno por tabla.

Para ver su estructura:

DESC materias

 Name                            Null?    Type

 ——————————- ——– —-

 MATERIA                         NOT NULL NUMBER(2)

 NOM_MATERIA                              VARCHAR2(35)

 CREDITOS                                 NUMBER(2)

2)      Tabla con restricciones tanto de columnas  como de la tabla.

CREATE TABLE estudiantes

   (matricula         NUMBER(5),

    nombre            VARCHAR2(35) NOT NULL,

    fecha_nacimiento  DATE,

    sexo              VARCHAR2(1) DEFAULT ‘M’

                      CONSTRAINT ck_sexo_estudiantes

    check (sexo in (‘M’,’F’)),

    CONSTRAINT pk_estudiante PRIMARY KEY (matricula) );

Si se desea que una columna tenga algún valor siempre, se define como NOT NULL. También se puede restringir a valores específicos utilizando CHECK. Todas estas restricciones son validadas por la Base de Datos.

Para ver su estructura:

DESC estudiantes

 Name                            Null?    Type

 ——————————- ——– —-

 MATRICULA                       NOT NULL NUMBER(5)

 NOMBRE                          NOT NULL VARCHAR2(35)

 FECHA_NACIMIENTO                         DATE

 SEXO                                     VARCHAR2(1)

3)      Relaciones entre Tablas.

CREATE TABLE notas

  (MATRICULA           NUMBER(5),

   MATERIA             NUMBER(2),

   CALIFICACION        NUMBER(3) NOT NULL,

CONSTRAINT pk_notas  PRIMARY KEY (matricula, materia),

CONSTRAINT fk1_notas FOREIGN KEY (matricula)

                     REFERENCES estudiantes(matricula),

CONSTRAINT fk2_notas FOREIGN KEY (materia)

   REFERENCES materias (materia)  );

Esta es una forma un poco más compleja, ya que esta tabla depende o más bien, esta referenciada a otras tablas. El PK esta compuesto por dos columnas  (matricula y materia). También tiene varias llaves secundarias o foráneas (FOREIGN KEY o FK), que a su vez son llaves primarias en la tabla referenciada.

Para ver su estructura:

DESC notas

 Name                            Null?    Type

 ——————————- ——– —-

 MATRICULA                       NOT NULL NUMBER(5)

 MATERIA                         NOT NULL NUMBER(2)

 CALIFICACION                    NOT NULL NUMBER(3)

Creación de Secuencias:

Las secuencias son objetos de Oracle que maneja una numeración automática.

CREATE  SEQUENCE  sequence_name

[INCREMENT BY n ]

[START WITH n ]

Los valores se obtienen mediante estas variables y solo en sentencias de SQL:

sequence_name.CURRVAL  (valor actual)

sequence_name.NEXTVAL (siguiente valor)

Ejemplo:

SQL> CREATE SEQUENCE empleado_sec;

SQL> Select empleado_sec.nextval from dual;

Modificación De Tablas:

Después de crear una tabla, a veces nos encontramos con que se necesita añadir una columna adicional o modificar la definición de una columna existente. Esta operación se puede realizar con el comando ALTER TABLE.

Hay que tener en cuenta varios puntos:

  • No es posible disminuir el tamaño de una columna al menos que la tabla esta vacía.
  • En las modificaciones, los tipos anterior y nuevo deben ser compatibles, o la tabla debe estar vacía.
  • La opción ADD … NOT NULL sólo será posible si la tabla está vacía o si se especifica un valor por defecto.
  • La opción MODIFY … NOT NULL sólo podrá realizarse cuando la tabla no contenga ninguna fila con valor nulo en la columna en cuestión.

ALTER  TABLE: Este comando modifica la estructura de una tabla.

Sintaxis:

ALTER TAB LE  table_name[ADD | MODIFY | DROP COLUMN] column_name  datatype c_constraint;

            Table_name                Nombre de la tabla a modificar

            Column_name             Columna a modificar

            C_constraint                Restricciones de la columna.

Ejemplos:

1)      Adiciona la columna profesor a la  tabla materias.

            ALTER TABLE materias ADD profesor VARCHAR2(5);

      SQL> DESC materias

 Name                            Null?    Type

 ——————————- ——– —-

 MATERIA                         NOT NULL NUMBER(2)

 NOM_MATERIA                              VARCHAR2(35)

 CREDITOS                                 NUMBER(2)

 PROFESOR                                 VARCHAR2(5)

2)      Este ejemplo modifica la columna profesor a la tabla materias.

            ALTER TABLE materias MODIFY profesor VARCHAR2(25) NOT NULL;

      SQL> DESC materias

 Name                            Null?    Type

 ——————————- ——– —-

 MATERIA                         NOT NULL NUMBER(2)

 NOM_MATERIA                              VARCHAR2(35)

 CREDITOS                                 NUMBER(2)

 PROFESOR                                 VARCHAR2(25)

3)      Adiciona la columna status a la  tabla materias.

ALTER TABLE materias ADD status VARCHAR2(1)

  CONSTRAINT ck_status_materias

  CHECK(status IS NOT NULL AND status IN (‘A’,’D’));

SQL> DESC materias

 Name                            Null?    Type

 ——————————- ——– —-

 MATERIA                         NOT NULL NUMBER(2)

 NOM_MATERIA                              VARCHAR2(35)

 CREDITOS                                 NUMBER(2)

 PROFESOR                        NOT NULL VARCHAR2(25)

 STATUS                                   VARCHAR2(1)

4)      Adiciona y borra columna aula de la tabla materias.

ALTER TABLE materias ADD aula NUMBER;

ALTER TABLE materias DROP COLUMN aula;

Alterando Restricciones:

Otra forma más compleja de modificar los componentes de una tabla es la siguiente.

Sintaxis:

ALTER TAB LE  table_name {[ADD | DROP]} CONSTRAINT constraint_name 

     {[PRIMARY KEY  (column_name, column_name,…) ] |

       [FOREIGN KEY   (column_name, column_name,…)

                 REFERENCES table_name_refs(r_column_name, r_column_name,…)]|

       [CHECK (condition)]}

 

            Table_name                Nombre de la tabla a modificar

            Column_name             Nombre columna a de la tabla.

            Constraint_name         Nombre de la Restricciones.

Table_name_refs         Nombre de la tabla referenciada.

R_column_name         Nombre columna a de la tabla Referenciada

Condition                    Condición que valida la restricción

Ejemplo:

  1. Elimina la restricción ck_status_materia  en la tabla MATERIAS; el pk_notas y fk1_notas de la tabla de NOTAS.

       ALTER TABLE materias DROP  CONSTRAINT ck_status_materias;

       ALTER TABLE notas      DROP  CONSTRAINT pk_notas;

      ALTER TABLE notas      DROP  CONSTRAINT fk1_notas;

 

  1. Adiciona la restricción  ck_status_materias  en la tabla MATERIAS.

             ALTER TABLE materias ADD  CONSTRAINT ck_status_materias

                          CHECK(status IS NOT NULL AND status IN (‘A’,’D’));

  1. Adiciona  el Primary Key de la tabla de NOTAS.

       ALTER TABLE notas  ADD  CONSTRAINT pk_notas

                          PRIMARY KEY (matricula, materia);

  

  1. Adiciona  el Foreign Key fk1_notas de la tabla de NOTAS.

              ALTER TABLE notas  ADD  CONSTRAINT fk1_notas

                                    FOREIGN KEY (matricula)  REFERENCES estudiantes(matricula);

 

EJERCICIO I

 1)       Crear una tabla llamada DEPTOS con las siguientes características:

 Id_departamento numérico de 5 dígitos, PK

Nom_departamento carácter de 5 posiciones.

2)      Crear una tabla llamada EMPLEADOS con las siguientes características:

 Id_empleado  numérico de 5 dígitos, PK

Nom_empleado   carácter de 35  posiciones, obligatorio.

Cargo carácter de 25 posiciones.

Id_departamento   numérico de 5 dígitos, FK referenciado a la tabla DEPTOS.

Fecha_nacimiento tipo fecha, obligatorio

Sexo  carácter de 1 posición, restringido a solo dos valores (F,M), obligatorio.

Sueldo  numérico de 12 dígitos y 2 decimales, obligatorio.

Status_empleado carácter de 1 posición, restringido a (A,D), obligatorio y valor A por defecto..

3)      Crear tabla maestro de transacciones llamada TRANSACCIONES:

 Id_transaccion numérico de 5 dígitos, PK

Nom_transaccion character de 35 posiciones, obligatorio.

Origen  carácter de 1 posición restringido a (D,C), obligatorio.

 4)      Crear una tabla de transacciones por empleados llamada TRANS_X_EMPLEADOS:

 Sec_Transaccion numérico de 10 dígitos, PK

Id_empleado  numérico de 5 dígitos, PK, FK referenciada a EMPLEADOS.

Id_transaccion numérico de 5, PK, FK referenciada a TRANSACCIONES.

Fecha_transaccion  tipo fecha, obligatorio.

Monto_transaccion numérico de 12 dígitos y 2 decimales, obligatorio.

5)      Modificar la columna Nom_departamento de la tabla DEPTOS aumentando el tamaño a 35 caracteres; obligatorio.

6)      Agregar la columna Comentarios de tipo variable (LONG) a la tabla EMPLEADOS

septiembre 28, 2009 Posted by | Oracle | Deja un comentario

Curso Basico de SQL (Capitulo I)

Introdución

 Este curso pretende ser una introducción al SQL, y en particular al de Oracle llamado SQL*Plus. No se pretende realizar un estudio exhaustivo de todas las opciones, comandos y aspectos de almacenamiento y administración que se pueden considerar en SQL. Sólo se ha deseado introducir y explicar los comandos más utilizados con sus opciones, suficientes para un programador. Esta orientado a personas principiantes en uso de la base de datos Oracle.

 

Elaborado por: Rafael Rivas

CAPITULO I – USO DEL SQL*PLUS                                                                            

  • Terminología                                    
  • Edición Sql*Plus     
  • Utilización De Ficheros
  • Comando Describe

 CAPITULO I – USO DEL SQL*PLUS

 Terminología:

 SQL Structured Query Language o Lenguaje de Consultas Estructurado. Es el lenguaje que permite la comunicación con el SGBD o Sistema Gestor de Bases de Datos (Oracle en nuestro caso).

 El SQL es un lenguaje unificado. Lo utilizan todo tipo de usuarios, desde el administrador de la base de datos, DBA, hasta el usuario final.

 El SQL es un lenguaje no procedimental. El usuario especifica Qué quiere, no Cómo ni Dónde conseguirlo.

 El SQL es relacionalmente completo. Permite la realización de cualquier consulta de datos.

 SQL= DDL + DML Las sentencias del SQL se clasifican como parte del DDL o del DML.

 DDL, Lenguaje de Definición de Datos: sentencias del SQL que permiten definir los objetos de la Base de Datos (create, revoke, grant, alter, etc.). Cuando se definen dichos objetos se almacenan en el diccionario de datos.

 DML, Lenguaje de Manipulación de Datos: sentencias del SQL que se utilizan para manejar los datos de la base de datos (select, insert, update, delete, etc).

 Commit/rollback: cada vez que se realiza alguna operación en la base de datos no se realiza  sobre la tabla en sí, sino en un segmento temporal en la base de datos conocida como RollBack Segment . Así, si queremos que los resultados de la modificación se trasladen a la base de datos y perduren en el tiempo hay que confirmar dicha operación con el comando commit. También se puede impedir que los últimos cambios lleguen a efectuarse con rollback, aunque existen algunas sentencias SQL que se ‘autoconfirman’ y no se pueden volver atrás.

 Diccionario de la Base de Datos: Guarda la definición de todos los objetos almacenados en la base de datos; sus características, restricciones, privilegios, relaciones entre ellos, tablas, índices, etc.

Edicion En Sql*Plus:

 SQL*Plus almacena en un buffer la última sentencia SQL introducida. El buffer mantiene sólo una sentencia cada vez, y si se introduce una nueva sentencia se sobrescribe sobre la anterior.

 La sentencia en el buffer puede ser recuperada para ejecutarla de nuevo con los comandos:

  • RUN que visualiza la sentencia en el buffer antes de ejecutarla;
  • / que ejecuta la sentencia sin visualizarla.

SQL*Plus también nos permite editar la sentencia SQL almacenada en el buffer mediante un sencillo (y limitado) editor en línea, cuyos comandos se enumeran a continuación:

Comando Abreviatura Descripción
APPEND texto A texto Añade texto al final de la línea.
CHANGE/fuente/destino C/fuente/destino Cambia el contenido ‘fuente’ por el ‘destino’
CHANGE/texto C/texto Quita ‘texto’ de una línea.
CLEAR BUFFER CL BUFF Borra el buffer
DEL DEL Borra una línea.
INPUT I Inserta una o más líneas.
INPUT texto I texto Inserta una línea con ‘texto’.
LIST L Lista las líneas del buffer
LIST n L n ó n Lista la línea n-ésima.
LIST * L * Lista la línea actual.
LIST LAST L LAST Lista la última línea.
LIST m n L m n Lista las líneas desde la m-ésima a la n-ésima.

Al contenido del buffer también se puede acceder desde el editor del Sistema Operativo. Así, el buffer podrá ser manipulado con las posibilidades del editor con el que estemos acostumbrados a trabajar. Al salir del editor se devuelve el control al SQL*Plus. Para conseguir trabajar con el editor del Sistema Operativo basta con colocar la variable DEFINE_EDITOR y luego llamar al editor.

 SQL> define_editor=notepad 
SQL> edit

Utilización De Ficheros:

SQL*Plus considera dos tipos de ficheros: de spool y de comandos.

Un fichero de spool almacena los resultados de una consulta (o varias) en un fichero con la extensión por defecto .lst (o lo manda a la impresora).

Los comandos asociados con los ficheros spool son

SPOOL fichero: Manda el resultado de las consultas al fichero.

SPOOL OUT: Envia el resultado de las consultas a la impresora.

SPOOL OFF: Cierra el fichero de spool.

EXIT: Al salir de SQL*Plus se cierran los ficheros de spool.

Los archivos de comandos almacenan comandos SQL y SQL*Plus para ser editado, almacenado y/o ejecutado; y tienen por defecto la extensión .sql :

  • Para editarlo se puede utilizar el comando edit fichero.
  • Para ejecutarlo se utilizará el comando START fichero o @fichero

El SQL*Plus nos proporciona más posibilidades en relación con los ficheros de comandos, la comunicación con el usuario final y la generación de informes. Pero antes de ver este tipo de cosas, es mejor que sigamos profundizando en el conocimiento del lenguaje SQL. Al final del curso se puede se encuentra un capítulo con algunas de las cosillas que quedan por contar del SQL*Plus.

Comando Describe:

SQL*Plus Oracle nos proporciona un comando que resulta muy útil cuando queremos conocer la estructura de una tabla, las columnas que la forman y su tipo y restricciones. Este comando toma una mayor importancia según nos alejemos del momento de creación de una tabla.

La sintaxis es la siguiente: DESCRIBE  table_name

Ejemplo:

SQL> desc dept
 Name                            Null?    Type
 ------------------------------- -------- ----
 DEPTNO                          NOT NULL NUMBER(2)
 DNAME                                    VARCHAR2(14)
 LOC                                      VARCHAR2(13)

Se puede usar solo las cuatro primeras letras de este comando (DESC).

septiembre 28, 2009 Posted by | Oracle | 1 comentario

Converting Your Oracle Forms Applications to Application Express 3.2

Purpose

This tutorial shows you how to convert your Oracle Forms Applications (including Menus and Reports) to Oracle Application Express 3.2.

Time to Complete

Approximately 60 minutes

Overview

In Oracle Application Express 3.2, a new utility has been provided to allow you to convert your Oracle Forms, Menus, Reports, PL/SQL Libraries and Object Libraries to an Oracle Application Express application. The process to convert your Oracle Forms applications is outlined in the diagram below:

formsmigration

In order to convert your Oracle Forms application, you need to perform the following steps:

1.

Convert Oracle Forms to XML: Run the Forms to XML Conversion tool, Forms2XML, to convert the Forms FormModules in your application. In addition, this tool will convert OLBs (Object Libraries) and MMBs (Menus). This creates XML output files.

2.

Convert PLLs to PLD Text: Run the Convert utility in Forms Builder to convert PLLs to PLD text format.

3.

Convert Reports to XML: Run the Convert utility in Reports Builder to convert your Reports to XML format.

4.

Create an Oracle Application Express Workspace: Run Oracle Application Express and create a workspace. Associate the workspace with the Oracle Forms application schema.

5.

Create a conversion project: Log in to the workspace created in Step 2 and navigate to Application Migrations from the Migrations Tasks region. Create a conversion project and load the application metadata from Step 1.

6.

Analyze the Oracle Forms application: From the Application Migration Workshop, verify and adjust the Forms application metadata. Refine the scope of conversion.

7.

Generate the Oracle Application Express Application: Create an application based on the selected Forms objects.

8.

Customize your Application Express application: Open your application in the Application Builder part of Application Express, and customize your converted application. You can change application attributes or add new pages to the application.

Prerequisites

Before you perform this tutorial, you should:

1.

Install Oracle Database 11g.

2.

Install Oracle Application Express Release 3.2 located on OTN.

3.

Download and unzip the forms_conversion.zip file into your working directory.

4.

Create an Application Express Workspace and user.

5.

In SQL*Plus, as your workspace user, execute the forms_conversion_ddl.sql file to create the forms database objects

6.

In SQL*Plus, as your workspace user, execute the forms_conversion_data_insert.sql file to load the data into the forms database objects.

Creating and Uploading Files into a Conversion Project

In this section, you create and update a conversion project. Perform the following steps:

1.

Enter the following URL to log in to Oracle Application Express.

http://<hostname>:8080/apex

2.

To log in to Oracle Application Express, enter the following details, and click Login.Workspace: <your workspace name>
Username: <your username>
Password: <your password>

3.

On the Workspace home page, under the Migrations region, click Application Migrations.

4.

Click Create Project.

5.

Enter a name for your Project. You will be converting an application from Oracle Forms. The default type is FORMS. Note that the other type is Access if you want to convert a Microsoft Access application. You need to have the FORMS schema loaded (from the Prerequisites section) and click Browse… for Forms Module XML file.

 

6.

Select customers_fmb.xml and click Open.

 

7.

Click Next. Make sure the schema where you created the forms database objects and loaded the data resides.

 

8.

Your customers_fmb.xml file has been uploaded. You need to upload a few more files. Click Upload Another File.

 

9.

Make sure that Forms Module (_fmb.XML) is selected for File Type and click Browse…

 

10.

Select orders_fmb.xml and click Open.

 

11.

Click Upload.

 

12.

Your orders_fmb.xml file has been uploaded. You need to upload one more file. Click Upload Another File.

 

13.

Make sure that PL/SQL Library (.PLD) is selected for File Type and click Browse…

14.

Select wizard.pld and click Open.

 

15.

Click Upload.

 

16.

Your wizard.pld file has been uploaded. You are now ready to create the project, click Finish.

 

17.

All the files have been uploaded. Although all the files are visible to the project page, most of the columns on the Interactive Report only relate to _fmb.xml files. For example, the Blocks, DB Blocks columns will always have values of 0 for all files except _fmb.xml files. You will review some of the objects for many of the files in later sections of this tutorial.

Note the Percent Complete column at the end of each row in this report. There are 2 components that determine this percentage: Applicablility and Completeness. If applicable is set to Yes then it is relevant to the conversion process and is evaluated for completeness. If applicable is set to No, then it is not relevant to the conversion process. If complete is set to Yes, the percent complete for this item is 100%. If applicable is set to Yes and complete is set to No, this item is relevant and the percent complete.

 

 Editing Your Conversion Project

You may want to set certain defaults for your Conversion Project. Perform the following steps:

1.

Under the Tasks region, select Edit Project Details and Applicability.

 

2.

On the Project Details page, you can change the schema associated with the project, you can also associate a different APEX application (ID) that has already been generated. You can change this using the pop-up LOV. In the Component Applicability region, you determine whether a particular category is relevant to the users conversion process. In this case, you don’t want alerts to be applicable for this conversion project. Select No for Alerts.

 

3.

Click the Trigger Applicability tab. Alternatively, if you are in the Show All mode, scroll down to the Trigger Applicability section.

 

4.

This section is similar to component applicability however is specific to triggers. Based on the trigger name and where the trigger was implemented within Oracle Forms, the table below will determine the applicability assigned to that trigger within the project. Click Apply Changes.

 

5.

Note that because you changed Alerts to not be applicable, the Percent Complete value changed. It is now higher because there are less objects that are relevant. Select the number link for alerts for the customers_fmb.xml file.

 

6.

Note that Applicable for both Alerts has been set to No. Click the Project:<project_name> breadcrumb. For example, in this case, Project:Forms Conversion OBE.

In the next section you will review the objects that will be generated when the application is created.

Reviewing and Analyzing the Objects in Your Project

In this section, you review and analyze the objects that were uploaded. Perform the following steps:

1.

From the Migration Project page, you can click each file to view the objects that were uploaded. You will view the Forms Objects first. Click the customers_fmb.xml file link.

 

2.

Select the component you want to view. In this case, you want to view Blocks. Select the Blocks link.

 

3.

A list of the blocks for the customers_fmb.xml file appear. You can include or not include blocks from this page. Notice that the navigation control blocks are not selected, because they don’t have a Data Source Name, so they will not be generated when you create your Application Express Application. You can also change the title of the block when it is generated. Enter Customer Details for S_CUSTOMER1 and Maintain Customer in the title field for S_CUSTOMERand click Apply Changes.

 

4.

You want to reviewedit the block information. Click the Name link of the S_CUSTOMER1 block.

5.

On the right side of the page, in the Block Status region, you see that this block will be converted into a Report and Form when the Application Express Application is created. Note that from this page, under Block Tasks, you can set applicability and completeness for this Block’s items and triggers. In addition, you can navigate to another Block by clicking it’s name in the list.

 

6.

On the left side of the window, you can view various information about the block. You can define specific annotations such as applicable, priority, complete and assign this block to a specific person on the development team to examine in closer detail or implement manually post-generation. In addition, the Notes section is automatically populated for many blocks with Incorporating Enhanced Query to identify that a POST_QUERY trigger has been interrogated and incorporated into the query that will be used when generating the application. Click Application Express Page Query. Alternatively, if you are in the Show All mode, scroll down to the Application Express Page Query section.

 

7.

When the Block is converted to a Report and Form in the Application Express Application, the query is enhanced by appending the POST-QUERY trigger logic in the query. You can change it to use the original query which is based on the database source item associated with the Block.

 

8.

Since you did not make any changes, click the Blocks breadcrumb. Note: There is currently an issue if you click Apply Changes and you haven’t made any changes to the query.

 

9.

You can also customize the query where you can specify a custom query to be used in the generation of the current block. Select the S_CUSTOMER link.

 

10.

Select Custom Query for Use Query and then copy the following in the SELECT statement into the Custom Query area. Then click Apply Changes.

select 
      «S_CUSTOMER».»ID»,
      «S_CUSTOMER».»NAME»,
      «S_CUSTOMER».»PHONE»,
      «S_CUSTOMER».»ADDRESS»,
      «S_CUSTOMER».»CITY»,
      «S_CUSTOMER».»STATE»,
      «S_CUSTOMER».»COUNTRY»,
      «S_CUSTOMER».»ZIP_CODE»,
      «S_CUSTOMER».»CREDIT_RATING»,
      «S_CUSTOMER».»SALES_REP_ID»,
      «S_CUSTOMER».»REGION_ID»,
      «S_CUSTOMER».»COMMENTS»,
      «S_EMP».»FIRST_NAME»||’ ‘||»LAST_NAME» «SALES_REP_NAME»
 from «S_CUSTOMER» «S_CUSTOMER»,
      «S_EMP» «S_EMP»
where «S_EMP».ID (+) = «S_CUSTOMER».SALES_REP_ID

The above SQL changes the enhanced query into a regular join expression rather than inner select.

 

11.

You can view the items and exclude a non database item so that it is not included when the application is created. Select the number link for the Item Count for S_CUSTOMER.

 

12.

Deselect the includeexclude checkbox for SALES_REP_NAME and change the Item Prompts for Phone to Telephone No. and Name to Customer Name. Click Apply Changes.

 

13.

Click your Project breadcrumb to return to the main Project list of files.

 

14.

Under the Triggers column, select the number link for the orders_fmb.xml file.

15.

Select the Trigger Name header and scroll down in the list to select WHEN-VALIDATE-RECORD.

 

16.

Click the Edit icon in front of the WHEN-VALIDATE-RECORD row.

 

17.

Notice that this validation should check to make sure that the order date is before the ship date. This validation does not get generated however you can annotate it to specify what tasks need to be completed after the application is generated and by whom.

Applicable refers to whether the component is important (Yes) or can be ignored (No). In this case the trigger is very important so Applicable should be left as Yes.

Complete indicates that the component has been implemented into the Application Express application. In this case, you only identify that the work needs to be performed post-generation. Therefore, complete is set to yes only after the developer has implemented the validation. In this case, Complete should be left as No.

Select a different user for Assignee and add a Note to the assignee as to why heshe was assigned to work on that object.

You can also set a tag which will allow you to search for all the objects with a particular tag. You will assign a tag to this trigger so that after your application is generated and you implement this trigger as a validation in Application Express, you can update the trigger as complete. Enter VALIDATION in the Tags field and click Apply Changes.

 

18.

The change has been processed. Click the Project breadcrumb.

 

19.

You want to review the blocks in the orders_fmb.xml file. Select the number of blocks link for orders_fmb.xml.

 

20.

Select the S_ORD block link.

 

21.

Notice in the Block Status region that this block will be converted as a Master Detail form.

 

22.

For Master-Detail conversions, the ‘Application Express Page Query’ region is not visible on the Block Details page since two tables are passed in rather than a query. Select the Blocks breadcrumb.

23.

Select the Item Count link for the S_ORD block.

 

24.

The list of Block Items appear. Notice the Item type column identifies the original block item type. When an item is generated, Application Express will attempt to convert the item type to an equivalent Application Express item type. For example, the Payment Type column will be generated as a radio group. Click the Project breadcrumb.

 

26.

You want to also review the PLSQL Library. Select the wizard.pld file link.

 

27.

Click the Annotations tab. Alternatively, if you are in the Show All mode, scroll down to the Annotations section.

 

28.

Change Priority to 4, enter Implement buttons to replicate wizard functionality on Page 0 for Notes, and enter BUTTON, PAGE 0 for Tags. Then click Apply Changes.

In the next section, you add some additional files (Menu, Report and Object Library) and review the files.

Adding More Files to Your Project

In this section, you add some additional files such as Form Menu, Report and Object Library to your project. Perform the following steps:

1.

From the Project page, click Upload File.

2.

Select Forms Menu (_mmb.XML) for File Type and click Browse… 

3.

Select customers_mmb.xml and click Open

4.

Click Upload and Upload Another.

5.

The customers_mmb.xml file has been uploaded. You need to upload a few more files. Select Oracle Report (.XML) for File Type and click Browse…

6.

Select Employees.xml and click Open.

7.

Click Upload and Upload Another.

8.

The Employees.xml file has been uploaded. You need to upload one more file. Select Object Library (_olb.XML) for File Type and click Browse…

9.

Select stndrd20_olb.xml and click Open.

10.

Click Upload.

11.

Select the Employees.xml link.

12.

The details for the report are displayed. The Report will be converted to an Interactive report, based upon the SQL Query, when the Application Express Application is generated. Click the SQL Query tab.

13.

The SQL query used to create the report is displayed. Click the Project breadcrumb.

   

Generating Your Application Express Application

In this section, you generate an application based on the conversion project. Perform the following steps:

1.

Before you create your application, you can set the application defaults. From Migration Project page, on the Tasks menu, click Set Application Defaults.

2.

You can set the Tabs, Authentication and Theme that will be used when the application is created. Select the Theme tab.

3.

Change the Theme to Theme 20 and click Apply Changes.

4.

From the Project window, click Create Application.

5.

There are two options when creating an application from a Migration Project. The first option is to base the application on a Migration Project. The second is to base the application on an existing application design model. This second option is useful when implementing a phased approach to migration where you have several applications you want to convert at different times. In this case, you want to create an application based on the first option. Select Based on Migration Project for Create Application and click Next.

6.

You see the list of pages that will be generated. You can add, modify or delete pages from this wizard page. Select the Employees page name link.

7.

You want to change the icon that will be displayed for this page. Select the flashlight next to Page icon.

8.

Select the biz_users_bx_128x128.png icon.

9.

The new icon has been inserted. Click Apply Changes.

10.

Click Next.

11.

Notice that Theme 20 is already selected because you set this theme in the application defaults. Click Next.

12.

Click Create.

13.

Your application was created successfully. Click the Run Application icon.

Reviewing Your Application Express Application

In this section, you review the resulting application. Perform the following steps:

1.

Enter your username and password and click Login.

2.

The Home page is displayed. The default template is Horizontal Images with Label List. Select the Customer Details image.

3.

An interactive report is displayed. You can navigate to the form by clicking one of the edit icons at the beginning of a row. In this case, you want to select the Home breadcrumb to return to the menu.

 

4.

Select the Maintain Customer image.

5.

The interactive report is displayed. The query behind this report comes from the custom query. Notice that Sales Rep Name shows the First Name and Last Name of the customer concatenated. To update the information in this report, click the edit icon in front of one of the records.

6.

A record is shown. Notice that the Customer Name item has an asterisk as it is mandatory, dates have a date picker associated, there is a select list for Credit Rating, and that the Comments uses a HTML Editor.  Notice that Sales Rep Name is not included because you excluded that block item in the S_CUSTOMER1 block. To see what validations were created, click the Edit Page link in the developer toolbar.

7.

Notice that a not null validation was created for Name and the Sales Rep ID and Region ID must be a number. Since you don’t know the Sales Rep IDs for all Sales Representatives and you have this field on multiple forms, you will create a shared LOV to show the list of Sales Representatives and then create a Select List on the Maintain Customers page that shows the LOV. Select the Shared Components icon.

8.

Under User Interface, select List of Values.

9.

Click Create.

10.

Click Next.

11.

Enter SALES_REPRESENTATIVES for the Name and select Dynamic for the Type and click Next.

12.

Enter the following SELECT statement in the Query area and click Create List of Values.

select distinct e.FIRST_NAME||’ ‘||e.LAST_NAME display_value,

                e.ID return_value
from S_EMP e, S_DEPT d
where e.DEPT_ID = d.ID

and d.NAME = ‘Sales’
order by 1

13.

Your LOV was created successfully. Now you can add it to the item on your page. Click the Edit Page icon. 

14.

Select the Items icon to navigate to the items area under Page Rendering.

15.

Select the P5_SALES_REP_ID item link.

16.

Change the Label to Sales Representative and the Display As to Select List and select the LOV tab.

17.

Select SALES_REPRESENTATIVES from the list of Named LOVs and click Apply Changes.

18.

Click Run.

19.

Select a Sales Representative from the list and click Apply Changes.

20.

Your change was processed. Click the Home breadcrumb.

21.

Select the Reports image.

22.

Select the Employees image.

23.

The interactive report with the list of Employees is displayed. Select a View icon next to one of the rows in the report.

24.

Notice that you can view the details but you can not make changes. Click the Home breadcrumb.

25.

You want to review the generated Master-Detail form for the S_ORD block. Select the S_ORD icon.

26.

The interactive report with the list of Orders is displayed. Select one of the edit icons in front of one of the rows to view the Master-Detail page.

27.

The Master-Detail page is displayed. The payment type has been generated as a radiogroup and the order filled as a checkbox. By pressing the less than and greater than arrows you can navigate from one order to the next and the items displayed will change accordingly. You want to make a few changes to the page. Click the Edit Page link in the developer toolbar.

28.

The first change you want to make is to create the validation that you reviewed in the Forms Conversion OBE migration project. You would like to create a validation that checks to make sure the ship date is later than the order date. Under Validations, click the Create Validation icon.

29.

Make sure Item Level Validation is selected and click Next.

30.

Select the P7_DATE_SHIPPED item and click Next.

31.

Select PLSQL and click Next.

32.

Select PLSQL Expression and click Next.

33.

Enter P7_DATE_SHIPPED less than P7_DATE_ORDERED for the Validation Name and click Next.

34.

Enter :P7_DATE_ORDERED <=  :P7_DATE_SHIPPED in the Validation field and Ship date is before order date! in the Error field. Then click Next. Release the doble quotes («).

35.

Select SAVE (Apply Changes) for When Button Pressed and click Create.

36.

Your validation was created. You can also use the SALES_REPRESENTATIVE named LOV you created earlier on this page. Under Items, select P7_SALES_REP_ID.

37.

Select SALES_REPRESENTATIVES for Named LOV and select the Show All tab.

38.

Enter Sales Representative for the Label and select Select List for Display As and click Apply Changes.

39.

Click Run.

40.

Change the Date Shipped to one day less than the Date Ordered and click Apply Changes.

41.

Note that an error occurred due to the validation you created. Also notice the Sales Representative is a drop down list now. Click the Home link in the developers toolbar.

At this point, you can update the generated Application Express Application with your specific requirements or modify the Migration Project and generate a new Application Express Application.

In the next section, you review the conversion project and what changes take place after you create your application.

 

Examining Your Conversion Project After Generation

In this section, you examine your conversion project now that it has been converted. Perform the following steps:

1.

On the Workspace home page, under the Migrations region, click Application Migrations.

2.

Select your Conversion project from the list.

3.

From the Tasks Menu, select Generated Applications.

4.

Select your application from the list.

5.

The Application page is shown with a list of all the pages that were generated. Click the Home breadcrumb.

6.

On the Workspace home page, under the Migrations region, click Application Migrations.

7.

You can view the details about the Conversion Project as a whole. Click the edit icon in front of the conversion project.

8.

On the right side of the window, you can view the Completion Status of the Project.

9.

On the left side of the window, you can view details about the project. Notice the Associated Application field which you can change by clicking the List of Values icon in the Project Details region.

Now that you have implemented the WHEN-VALIDATE_RECORD trigger as a validation in your Application Express application, you can set the Complete field to Yes for that trigger. Click the Application Migrations breadcrumb.

10.

Select the number of triggers link.

11.

All the triggers are shown in this conversion project. You had already tagged the WHEN-VALIDATE-RECORD trigger with the tag VALIDATION. As a result, you can create a filter to show only the triggers with tags=VALIDATION. Select Filter from the Action pulldown.

12.

Select Tags from the list of Columns and enter VALIDATION in the Expression field. Then click OK.

13.

Notice that the WHEN-VALIDATE-RECORD trigger is shown. Select the Edit icon.

14.

Change Complete to Yes and click Apply Changes.

15.

Your trigger in the conversion project was updated. Click the Project breadcrumb.

16.

Notice that since you have a generated application, from the Project page, you can click the Run Application button to run the generated application.

17.

The Application menu appears.

 

Summary

In this tutorial, you learned how to:

 

Create and upload files into a migration project

 

Edit your migration project

 

Review and analyze the objects in your project

 

Add more files to your project

 

Create and run your Application Express application

 

Examine your conversion project after generation

 

 

Related Information

 

You can find the Application Migration Guide on the Application Express Documentation Page on OTN

 

Other Application Express information on OTN

 

 

 

septiembre 18, 2009 Posted by | Database, Developer, Oracle, Tecnologia | Deja un comentario