Sistemas de Bases de Datos I - Taller CI3315

Prof. Nunzio N. Savino V.

Enero-Abril 2002

Tema Nro. 1 Oracle y SQL

El Manejador de Bases de Datos Relacionales ORACLE
Como la segunda empresa vendedora de software a nivel mundial, ORACLE provee una plataforma completa para desarrollar aplicaciones que utilicen el recurso dato. Algunas de las herramientas que provee son las siguientes: • Un servidor de datos llamado ORACLE que permite almacenar y manipular datos de diferente índile (imágenes, sonidos, texto, caracteres, números, etc.). Hoy en día la última versión del servidor de datos es la 9i. Nosotros utilizaremos la versión 8i y específicamente la versión 8.1.6 para el sistema de operación Linux. • Un entorno de edición en línea que incorpora un intérprete de SQL, llamado SQL*PLUS. • Un lenguaje procedimental que permite utilizar estructuras de control y variables para elaborar programas que accedan a la base de datos donde se pueda utilizar comandos SQL, conocido como PL/SQL (Procedural Language for SQL). Este lenguaje es reconocido y procesado también por SQL*PLUS. • Una serie de bibliotecas para la programación utilizando otros lenguajes. Esta biblioteca conocida como OCI (Oracle Call Interfaces) fue la solución inicial al problema de desarrollar sistemas cliente/servidor. Hoy en día ORACLE provee una biblioteca propietaria de funciones para realizar comunicación con servidores de datos utilizando Java, la cual es conocida como JDBC (Java Database Connection). • Una serie de pre-procesadores (pre-compiladores) de SQL embebido, que constituyó la primera solución al problema de desarrollar programas para bases de datos. Existieron pre-compiladores que aceptaban instrucciones en un lenguaje de programación particular de tercera generación (en el caso de ORACLE los lenguajes ofrecidos era ADA, PL/I, COBOL, FORTRAN y C) junto con instrucciones del lenguaje SQL. Estas herramientas eran conocidas como Pro*ADA, Pro*PL/I, Pro*COBOL, Pro*Fortran y Pro*C. • Extensiones específicas al intérprete del lenguaje SQL para soportar nuevas tecnologías. En este apartado vale la pena destacar SQLJ como un lenguaje que admite el uso simultáneo del lenguaje Java y de SQL. • Todo un grupo de herramientas basadas en lenguajes de cuarta generación y tecnología CASE destinadas a asistir a los diseñadores y programadores en la tarea de desarrollar grandes aplicaciones. Las versiones actuales de estas herramientas se conocen como ORACLE/Designer y ORACLE/Developer. • Toda una serie de herramientas destinadas a ayudar al administrador de la base de datos en sus tareas cotidianas. En este apartado la herramienta más importante es OEM (Oracle Enterprise Manager). De todas estas herramientas, en el taller del curso se hará uso del servidor de datos y del entorno de edición y procesamiento SQL*PLUS. ACCEDIENDO A LOS SERVICIOS DE SQL*PLUS En un entorno en el que los computadores utilizados no poseen específicamente ní el DBMS ni clientes específicos para acceder al DBMS se deberá acceder directamente al servidor en el

Página 1 de 9

Sistemas de Bases de Datos I - Taller CI3315

Prof. Nunzio N. Savino V.

Enero-Abril 2002

Tema Nro. 1 Oracle y SQL

que se ejecutan los procesos del DBMS. En nuestro caso particular, para hacer la conexión a SQL*Plus será necesario conectarse al servidor de bases de datos (sholem.ldc.usb.ve). ORACLE permite asociar a cada usuario una cuenta diferente a que éste utiliza para acceder a los servicios del sistema de operación, aún cuando dependiendo de las políticas de administración de la base de datos se puede configurar el DBMS para que se utilicen sólo las cuentas del sistema de operación (autenticación basada en el sistema de operación). En nuestro caso particular Ud. poseerá una cuenta de usuario distinta a la cuenta que Ud. posee para acceder a los servicios del Laboratorio Docente. Para establecer una sesión con SQL*PLUS se ejecuta el programa sqlplus. Entre sus formas de invocación, el programa admite las siguientes: • sqlplus, que accede al programa para solicitar servicios al DBMS. Al ejecutar este comando se le pedirá el nombre del usuario que desea conectarse y su contraseña. • sqlplus <loginname>, que permite conectar al usuario <loginname> a SQL*PLUS, para así acceder a los servicios del DBMS. Al ejecutar este comando se le pedirá la contraseña del usuario ORACLE (aquella cuyo nombre de usuario es <loginname>). • sqlplus <loginname>/<password>, que permite conectar al usuario <loginname> con contraseña <password> a SQL*PLUS, para así acceder a los servicios del DBMS. Si la conexión ha sido exitosa se podrá observar el mensaje del intérprete de SQL SQL> Si la conexión no ha sido exitosa se indicará el error respectivo. En caso de conexiones fallidas por errores en el nombre del usuario o en la contraseña, el programa solicitará tres veces la entrada de esta información y luego abortará. ¿Cómo cambiar la contraseña de un usuario? Todo usuario que posee una cuenta en ORACLE que no se gestiona a través de los servicios de seguridad del sistema de operación puede cambiar su contraseña. El comando del lenguaje de control de datos que permite realizar esta operación es ALTER USER <loginname> IDENTIFIED BY <newPassword>; Ud. podrá ejecutar esta operación desde la línea de comandos de SQL*PLUS. ¿Cómo salir de SQL*Plus? El comando QUIT de SQL*PLUS permite finalizar la sesión activa en el intérprete de SQL. En tal sentido SQL> quit;

Página 2 de 9

Sistemas de Bases de Datos I - Taller CI3315

Prof. Nunzio N. Savino V.

Enero-Abril 2002

Tema Nro. 1 Oracle y SQL

le permitirá salir del intérprete de SQL y regresar al intérprete de comandos del sistema de operación. ¿Qué puede hacerse con SQL*Plus? SQL*PLUS puede ser utilizado para ejecutar cualquier comando del lenguaje de definición, manipulación o control de datos de SQL. La versión que Ud. utilizará la permitirá ejecutar cualquier instrucción definida en el estándar SQL2 (las que utilizaremos en este curso) más todas aquellas operaciones específicas de PL/SQL. Adicionalmente SQL*PLUS ofrece una serie de facilidades para la edición de comandos. En el manual en línea de SQL*PLUS que Ud. conseguirá en la página del curso podrá aprender como aprender y explotar todas las facilidades que ofrece la herramienta.

El Lenguaje Estructurado de Consultas SQL
Los sistemas manejadores de bases de datos que implementan el modelo de datos relacional efectúan operaciones de creación de estructuras, consulta, inserción, eliminación y control de datos utilizando un lenguaje llamado SQL ( Lenguaje Estructurado de Consultas – “Structured Query Language” -). Este lenguaje se basa en dos de los formalismos que se han descrito para especificar operaciones del modelo relacional (álgebra relacional y cálculo relacional de tuplas). SQL, como lenguaje de programación, posee diferentes dialectos o variaciones. Sin embargo existen dos grandes estándares a los que se ciñen los manejadores de bases de datos. Estos estándares son: • ANSI SQL, que fue propuesto por el Instituto de estándares nacionales americanos (ANSI). • Una actualización del estándar ANSI SQL propuesto en 1992 y conocido como SQL-92 o SQL2. Con la evolución del modelo relacional para manejar características propias del paradigma de orientación por objeto (conocido como enfoque post-relacional u objeto-relacional), así como para la descripción de condiciones dinámicas que rigen la evolución de los datos y el almacenamiento de programas; hoy en día existe un esfuerzo de consolidación y adopción de un nuevo estándar conocido como SQL3. Sin embargo, las herramientas comerciales ofrecen algunas de las características novedosas incluidas en este estándar.

Página 3 de 9

Sistemas de Bases de Datos I - Taller CI3315

Prof. Nunzio N. Savino V.

Enero-Abril 2002

Tema Nro. 1 Oracle y SQL

La Implementación del Lenguaje de Definición de Datos de SQL en ORACLE
Desde un punto de vista netamente relacional, ORACLE implementa una versión de SQL totalmente compatible con el estándar ANSI SQL, pero agrega algunas características propias de otros estándares como SQL2 e inclusive SQL3. En realidad el DBMS posee características propias de otros modelos de datos (en particular del modelo objetorelacional o post-relacional) que no se discuten en este curso. Entre los diferentes tipos de objetos que ORACLE permite definir y manipular son: • Tablas: Implementan el concepto de relación del modelo relacional. Toda tabla está conformada por una serie de columnas (implementan el concepto de atributo). Cada columna posee un nombre, un tipo de datos y dependiendo del tipo de datos una longitud. Dos diferencias fundamentales entre el modelo relacional y la implantación de éste en ORACLE son: o Si no se definen restricciones de integridad de identidad, en una tabla pueden existir filas (tuplas) con los mismos valores para todas sus columnas. o A pesar de que físicamente se establece un orden entre las tuplas, a nivel lógico el usuario no es capaz de determinar tal orden.

Vistas: Constituyen una especie de “tablas virtuales”, es decir tablas que no existen físicamente sino que son generadas automáticamente cuando se accede a ellas. Una vista puede ser definida a través de una operación de consulta sobre una o más tablas o vistas de la base de datos.

deben cumplir los datos almacenados en la base de datos. En un sentido amplio, esta construcción está relacionada con aquellas restricciones de integridad derivadas del esquema relacional que se implanta en el DBMS. Por lo tanto, esta construcción puede ser utilizada para definir restricciones de integridad de identidad, restricciones de integridad referencial, restricciones de dominio en las columnas de una tabla o inclusive ciertas restricciones explícitas. Esta construcción se basa en asociar una expresión declarativa que siempre deberá ser cierta en el contexto de la tabla donde se define.

“Constraints”: Constituyen el mecanismo primordial para especificar ciertas reglas que

Sinónimos: Permiten definir referencias directas a un objeto de la base de datos. A través de los sinónimos se puede permitir el acceso público a un determinado objeto u ocultar el nombre real del objeto. Un usuario puede crear sinónimos que sólo son visibles por él, o hacer que el sinónimo sea de uso público (pueda ser utilizado por otros usuarios de la base de datos). Unidades de Programa: ORACLE provee cuatro grandes tipos de unidades de programas: las funciones, los procedimientos almacenados (“stored procedures”), los “triggers” y los Página 4 de 9

Sistemas de Bases de Datos I - Taller CI3315

Prof. Nunzio N. Savino V.

Enero-Abril 2002

Tema Nro. 1 Oracle y SQL

paquetes (“packages”). Toda unidad de programa puede ser escrita utilizando SQL y PL/SQL (constituye la forma más común). Tanto las funciones y los procedimientos suelen utilizarse como parte de la definición de un esquema relacional para implementar restricciones de integridad, reglas del negocio o políticas determinadas a ser garantizadas por la base de datos. Los “triggers” son un tipo especial de procedimientos almacenados que se aplican en una o más tablas, siguiendo la teoría de reglas ECA (reglas Event-Condition-Action) propias de un paradigma de modelado de bases de datos conocido como Bases de Datos Activas. En tal sentido, y adicionalmente a la especificación de las acciones a realizar, un “trigger” indica: • El evento a partir del cuál automáticamente se ejecutará la acción indicada. Los eventos que pueden ser especificados pueden resultan de la composición de un tipo de operación (inserción de una fila, modificación de una fila o eliminación de una fila) y un instante de tiempo (previo a la ejecución de la operación que se solicita, posterior a la operación que se solicita o en lugar de la operación que se solicita). • La condición que establece cuando se aplicarán la acciones indicada en el “trigger”. Por otra parte, los “packages” proveen un mecanismo sencillo para encapsular y almacenar un grupo de operaciones (funciones y stored procedures) que se encuentran relacionados. En tal sentido pueden ser considerados como construcciones que permiten definir, de alguna forma, la noción de tipos abstractos de datos en la implantación del modelo relacional que hace ORACLE.

Enlaces: Son construcciones que permiten asignar nombres a bases de datos diferentes con el fin de proveer la inter-operabilidad entre éstas. Este tipo construcciones se utilizan en los diferentes enfoques de inter-operación de bases de datos (bases de datos federadas, bases de datos distribuidas, etc.) y se escapan de los objetivos de este curso.

Para el primer taller nos ocuparemos de los objetos básicos para almacenar datos (tablas) y de las restricciones definibles a través de objetos CONSTRAINT. Los comandos que provee ORACLE para realizar estas operaciones son: • CREATE TABLE • DROP TABLE • ALTER TABLE Dado que los “constraints” son objetos que dependen estrictamente de la existencia de una tabla, no existe un comando específico que crear o eliminar un “constraint”, sino que estos comandos deben formar parte de lo que se indica en un comando CREATE TABLE o ALTER TABLE. A continuación se explicará brevemente el comando CREATE TABLE, DROP TABLE y la forma de agregar “constraints” durante la creación de una tabla o posterior a la creación de Página 5 de 9

Sistemas de Bases de Datos I - Taller CI3315

Prof. Nunzio N. Savino V.

Enero-Abril 2002

Tema Nro. 1 Oracle y SQL

la misma utilizando el comando ALTER TABLE. Ud. deberá consultar el manual de referencia de SQL para estudiar todas las potencialidades del comando ALTER TABLE. EL COMANDO CREATE TABLE Este comando permite crear una tabla en la base de datos. Una forma particular del comando CREATE TABLE para una tabla basada en el modelo relacional, y que se crea sin requerir de datos ya existentes en otras tablas es: CREATE TABLE [<schema>.]<table_name> ( <column_name> <datatype> [DEFAULT <expr>] [NULL | NOT NULL] {, <column_name> <datatype> [DEFAULT <expr>] [<NULL | NOT NULL>]} {, <table_constraint>} ); donde:

• • • • •

<schema> es el nombre de un usuario de la base de datos. Si no se coloca este identificador se supondrá que la tabla será del usuario que residirá en el esquema asociado al usuario que la está creando. <table_name> es el nombre con el que se designará la tabla. <column_name> es el nombre con el que se designará a cada una de las columnas <datatype> representa uno de los tipos de datos admitidos por ORACLE. <expr> es una expresión que debe evaluar <table_constraint> es la especificación de un “constraint” a ser definido sobre las columnas de la tabla.

La forma presentada es una de las posibles formas de ordenar la declaración de columnas y restricciones en la que: • Primero se describe cada una de las columnas de la tabla con su tipo de datos, su valor por defecto (utilizando la cláusula DEFAULT) y si la columna admite o no el valor NULL. • Luego se indican las restricciones de integridad asociada a la tabla utilizando las estructuras de “constraints“ que se verán posteriormente. La forma del comando CREATE TABLE permite diferenciar las estructuras de las restricciones implícitas y hacer más sencilla la lectura del comando. Sin embargo, en el manual de referencia de SQL Ud. podrá encontrar todas las variaciones sintácticas de este comando. EL COMANDO DROP TABLE Este comando permite eliminar una tabla (borrar las filas e inclusive eliminar la estructura) de la base de datos. La forma general de este comando es DROP TABLE [<schema>.]<table_name> [CASCADE CONSTRAINTS]; Página 6 de 9

Sistemas de Bases de Datos I - Taller CI3315

Prof. Nunzio N. Savino V.

Enero-Abril 2002

Tema Nro. 1 Oracle y SQL

Si se utiliza la opción CASCADE CONSTRAINTS, se eliminarán todas aquellas restricciones de integridad referencial definidas en otras tablas de la base de datos que referencien a la tabla que se está eliminando. DEFINICIÓN DE CONSTRAINTS ORACLE permite definir los siguientes tipos de “constraints” : • NOT NULL. Cuando esta declaración se agrega en la especificación de una columna se indica que ninguna fila de la tabla puede ser tal que el valor para dicha columna sea NULL. La opción por defecto en ORACLE es la de suponer que toda columna admite el valor NULL, sin embargo puede indicarse explícitamente (para hacer más legible un “script”) el hecho de que la columna admita el valor NULL. • UNIQUE. Cuando esta declaración se agrega a una o más columnas de una tabla se indica que, en ningún momento, podrán existir dos filas en la tabla que tengan el mismo valor para las columnas que se están indicando como únicas en el “constraint”. • PRIMARY KEY. Cuando esta declaración se agrega a una o más columnas de una tabla se indica que estas columnas constituyen la clave primaria de la tabla. • FOREIGN KEY. Cuando esta declaración se agrega a una o más columnas de una tabla se indica que estas columnas constituyen una clave foránea de la tabla hacia alguna tabla de la base de datos. • CHECK. Cuando esta declaración se agrega a una tabla se indica que no se admitirá ninguna fila en la tabla que no cumpla con una condición lógica establecida por el “constraint”. De acuerdo con la forma de especificación del comando CREATE TABLE dada anteriormente, la cláusula <table_constraint> puede entonces tener las siguientes formas:

• • • •

CONSTRAINT <constraint_name> PRIMARY KEY (<column_name>[,<column_name>]) CONSTRAINT <constraint_name> UNIQUE (<column_name>[,<column_name>]) CONSTRAINT <constraint_name> FOREIGN KEY (<column_name>[,<column_name>]) REFERENCES <table_name> CONSTRAINT <constraint_name> CHECK (<condition>)

Donde:

• • • •

<constraint_name> es el nombre con el que se designará al “constraint” en el esquema donde se crea la tabla que lo incluye. <column_name> es el nombre de una columna de la tabla en la que se define el “constraint” <table_name> es el nombre de una tabla definida en el esquema donde existe la tabla que incluye el “constraint”. <condition> es una expresión lógica de SQL.
Página 7 de 9

Sistemas de Bases de Datos I - Taller CI3315

Prof. Nunzio N. Savino V.

Enero-Abril 2002

Tema Nro. 1 Oracle y SQL

En el manual de referencia de SQL Ud. podrá encontrar información sobre las reglas de formación de expresiones lógicas de SQL. Un punto importantísimo a destacar es el de garantizar que los nombres de los “constraints” sean nemónicos. Toda vez que un “constraint” sea violado, el DBMS generará un mensaje de error indicando el “constraint” que ha fallado. Asignar nombres nemónicos permitirá hacer la depuración de programas y la carga de datos mucho más sencilla, además de garantizar una perfecta cohesión entre el esquema de implantación y la documentación del esquema lógico. Es así como se sugiere utilizar el siguiente estándar de nomenclatura: • Para restricciones de no-nulidad se recomienda no crear “constraints” sino declarar la no-nulidad al momento de creación de la tabla y para cada columna. Esto se debe al hecho de que el módulo de chequeo de integridad de ORACLE no utiliza el nombre de la restricción de integridad para indicar que el valor de una columna en una fila deba ser nulo si se indica lo contrario. • Para asociar un “constraint” de clave primaria a una tabla <table_name> se recomienda designar el “constraint” con el nombre PK_<table_name>. • Para asociar un “constraint” de unicidad relacionado con una clave alterna de la tabla <table_name>, se recomienda designar el “constraint” con el nombre AK_<table_name>. Si existen varias claves alternas podrá agregársele al nombre del “constraint” un indicador que permita diferenciar cada una de estas claves alternas. • Para asociar un “constraint” de clave foránea a una tabla <table_name1> que referencia a una tabla <table_name2> se recomienda designar el “constraint” con el nombre FK_<table_name1>__<table_name2>. Si existen múltiples claves foráneas en la tabla <table_name1> que referencias a la tabla <table_name2> entonces será necesario colocar algún indicador que permita diferenciar cada uno de los “contraints”. Un posible nombre a utilizar será el nombre de la interrelación (y en rol en caso de interrelaciones recursivas) del esquema conceptual a partir de la cual se generó la clave foránea que define el “constraint”. • Para asociar un “constraint” que represente una restricción de dominio sobre una columna <column_name> de una tabla <table_name>, se sugiere utilizar DOM_<table_name>__<column_name> como nombre del “constraint”. • Para asociar un “constraint” que represente una restricción explícita, que puede ser descrita a través de una restricción de tipo CHECK, de una tabla <table_name> se sugiere utilizar EXP_<table_name>__R<constraint_number> como nombre del “constraint”. En este nombre <constraint_number> representará el número de restricción explícita asociado en la documentación del esquema relacional que se implanta. Los “constraints” pueden ser agregados a una tabla previamente creada, o eliminados de una tabla existente. Para tal fin se pueden utilizar dos variaciones del comando ALTER TABLE, cuya sintaxis a continuación se indica:

ALTER TABLE <table_name> ADD (<table_constraint> [,<table_constraint>]);

Página 8 de 9

Sistemas de Bases de Datos I - Taller CI3315

Prof. Nunzio N. Savino V.

Enero-Abril 2002

Tema Nro. 1 Oracle y SQL

Permitirá agregar una o más “constraints” a la tabla <table_name> existente en la base de datos. Cada uno de los “constraints” que se añaden a la tabla seguirán las convenciones sintácticas de la cláusula <table_constraint>.

ALTER TABLE <table_name> DROP CONSTRAINT <constraint_name> [CASCADE];

Eliminará de la tabla <table_name> la restricción <constraint_name>. Si se utiliza la cláusula CASCADE, la eliminación del “constraint” tendrá como efecto eliminar cualquier otro “constraint” que esté relacionado con el “constraint” que se elimina. Por ejemplo, si se elimina un “constraint” de clave primario de una tabla A bajo modalidad “constraint” entonces se eliminarán los “constraints” de clave foránea que referencien a A. SOBRE LÍMITES ORACLE impone los siguientes límites en lo que respecta a los objetos descritos en esta sección: • La longitud de cualquier identificador (nombre de tabla, nombre de columna, nombre de “constraints”, entre otros) se limita a un máximo de 30 caracteres. • El número máximo de columnas que puede tener una tabla es de 1000. • El número máximo de columnas que pueden constituir una clave primaria, una clave alterna o una clave foránea es de 16. UN EJEMPLO DE CREACIÓN DE TABLAS A continuación se presenta un ejemplo de un comando de creación de tablas CREATE TABLE EMPLEADO ( NUMERO NUMBER(3) NOT NULL, CI NUMBER(8) NOT NULL, NOMBRE VARCHAR2(20) NOT NULL, CARGO VARCHAR2(9) NOT NULL, JEFE NUMBER(3) NULL, INGRESO DATE NULL, SUELDO NUMBER(10,2) NOT NULL, NUMERO_DEPTO NUMBER(2) NOT NULL, CONSTRAINT PK_EMPLEADO PRIMARY KEY (NUMERO), CONSTRAINT AK_EMPLEADO UNIQUE (CI), CONSTRAINT FK_EMPLEADO__EMPLEADO FOREIGN KEY (JEFE) REFERENCES EMPLEADO, CONSTRAINT FK_EMPLEADO__DEPTO FOREIGN KEY (NUMERO_DEPTO) REFERENCES DEPTO, CONSTRAINT DOM_EMPLEADO__SUELDO CHECK (SUELDO > 0), CONSTRAINT DOM_EMPLEADO__NOMBRE CHECK (NOMBRE= NLS_UPPER(NOMBRE)) );

Página 9 de 9