Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Oracle - PLSQL
Presentación:
A continuación, comenzaremos con los primeros pasos para aprender programación de
bases de datos, utilizaremos la base de datos relacional del motor de Oracle para
practicar. Veremos como declarar variables, y como se escriben distintas sentencias de
ejecución.
Objetivos:
Que los participantes*:
• Aprenden las ventajas de PLSQL.
• Aprendan a declarar variables.
• Aprendan a escribir sentencias básicas de PLSQL.
• Aprendan lo que es un cursor implícito.
En esta Unidad los participantes se encontrarán con diferentes tipos de actividades que, en
el marco de los fundamentos del MEC*, los referenciarán a tres comunidades de
aprendizaje, que pondremos en funcionamiento en esta instancia de formación, a los
efectos de aprovecharlas pedagógicamente:
Es importante que todos los participantes realicen algunas de las actividades sugeridas y
compartan en los foros los resultados obtenidos.
El carácter constructivista y colaborativo del MEC nos exige que todas las actividades
realizadas por los participantes sean compartidas en los foros.
Tomen nota*
Las actividades son opcionales y pueden realizarse en forma individual, pero siempre es
deseable que se las realice en equipo, con la finalidad de estimular y favorecer el trabajo
colaborativo y el aprendizaje entre pares. Tenga en cuenta que, si bien las actividades son
opcionales, su realización es de vital importancia para el logro de los objetivos de
aprendizaje de esta instancia de formación. Si su tiempo no le permite realizar todas las
actividades, por lo menos realice alguna, es fundamental que lo haga. Si cada uno de los
participantes realiza alguna, el foro, que es una instancia clave en este tipo de cursos,
tendrá una actividad muy enriquecedora.
Asimismo, también tengan en cuenta cuando trabajen en la Web, que en ella hay de todo,
cosas excelentes, muy buenas, buenas, regulares, malas y muy malas. Por eso, es
necesario aplicar filtros críticos para que las investigaciones y búsquedas se encaminen a
la excelencia. Si tienen dudas con alguno de los datos recolectados, no dejen de consultar
al profesor-tutor. También aprovechen en el foro proactivo las opiniones de sus compañeros
de curso y colegas.
Componentes de Oracle
✓ Oracle Enterprise Manager Grid Control (la interfaz gráfica amigable al usuario)
• Planillas Excel
• Documentos de Word
• Presentaciones de PowerPoint
• XML
• Multimedia, como ser MP3, video, y gráficos.
Oracle Enterprise Manager Grid Control: Es una consola completa, integrada que permite
manejar en forma centralizada tareas administrativas del entorno. De esta manera, se
puede tener Hardware variado que incluya nodos, bases de datos, application servers y
otras aplicaciones todo junto como si funcionaría como 1 sola instancia. Se puede de esta
manera, ejecutar “Jobs”, establecer políticas de seguridad, monitorear la performance y
automatizar procesos de una forma mucho más sencilla y eficiente.
Es bueno tener en cuenta cuales van a ser las tablas y las relaciones entre ellas antes de
que comencemos a programar. La idea es que no pierdan tiempo en buscar, como se
relacionan las misma y focalizarse solamente en la resolución de ejercicios.
Este es el modelo…
Y para ser más detallista aún, les explico funcionalmente que contiene cada tabla…
ningún departamento.
empleados.
3. jobs => Contiene lo tipos de trabajo que puede tener cada empleado.
4. job_history => Contiene el historial de trabajos de cada empleado. Si el
empleado cambia de departamento relacionado con un tipo de
6. regions => Contiene regiones como ser, America, Asia, Europa, etc.
7. countries => Contiene países, y su relación con las regiones.
SQL (Lenguaje de consultas estructurada) es el primer lenguaje que se utiliza para acceder
y modificar la información que se almacena en las bases de datos relacionales.
Sin embargo, si uno quiere alterar la información de una forma condicional, existen algunas
limitaciones con este lenguaje.
Por ejemplo, por cada empleado que se devuelve en una consulta, queremos verificar el
department_id y el salario. Dependiendo del departamento y de la performance del
empleado, se pagará un “bono” a cada uno de ellos.
empleados de esos departamentos. También recordemos que tenemos que tener en cuenta
el salario del empleado. Esto parece un poco complicado.
Por lo tanto, esto parecería más fácil, si tenemos sentencias condicionales. PL/SQL está
diseñado para este tipo de requerimientos. Este provee la extensión de programación sobre
el lenguaje SQL.
PL/SQL:
Entorno de PL/SQL
PL/SQL contiene bloques con sentencias procedurales, y sentencias SQL. Cuando uno
sube un bloque PL/SQL al Server, la ingeniería del PL/SQL se divide o “parsea” en bloques.
El bloque PL/SQL identifica las sentencias procedurales y las sentencias SQL. Este envía
las sentencias procedulares, al “ejecutor se sentencias procedurales”, y por otro lado,
realiza la misma acción con las sentencias SQL pero “al ejecutor de sentencias de SQL”.
Todo, en forma separada.
Beneficios de PL/SQL
Cuáles son los beneficios del lenguaje de programación de base de datos Oracle, PL/SQL?
Ahora los vamos a enunciar y vamos a explicar cada uno de ellos para que te quedes
tranquilo de poder entenderlos.
✓ Mejora de Performance
✓ Portabilidad
✓ Manejo de Excepciones
Por lo tanto, esta integración te provee una forma de manejar mejor el control de tus
sentencias SQL. Ya veremos más adelante ejemplos de esto.
✓ Mejora de Performance
Sin el lenguaje PL/SQL, no hay forma de combinar varias sentencias de SQL como
si fuera una sola unidad de ejecución. Si por ejemplo diseñamos, una aplicación con
Oracle Forms (Son formularios o pantallas que pueden servir como ABM’s), nosotros
tenemos varios campos en cada form. Cuando el form sube la información nosotros
tenemos que ejecutar varias sentencias de SQL. Dichas sentencias, son enviadas a
la base de datos una a la vez. Esto genera, un flujo en la red importante de cada una
de las sentencias enviadas, y reduce la performance en el modelo cliente/servidor.
Con PL/SQL, se pueden combinar todas estas sentencias de SQL en una sola unidad
de programación. La aplicación, envía todo el bloque a la base de datos en lugar de
enviar una por una las sentencias de SQL. Esto reduce significativamente el número
de llamadas a la base de datos.
✓ Portabilidad
Los programas de PL/SQL pueden ejecutarse en el Oracle Server
independientemente del sistema operativo y la plataforma.
✓ Manejo de Excepciones
PL/SQL te da la posibilidad de manejar y ocultar excepciones. Se pueden definir
bloques separados que gestionen estas excepciones.
DECLARE (Opcional)
BEGIN (Mandatorio)
- Sentencias de SQL
- Sentencias de PL/SQL
EXCEPTION (Opcional)
END; (Mandatorio)
1. Declarative (opcional).
Esta sección comienza con la palabra reservada “DECLARE” y termina con la
2. Ejecutable (requerida).
La sección ejecutable comienza con la palabra “BEGIN” y termina con la palabra
“END” seguido del “;” punto y coma. Esta sección a su vez puede incluir otros bloques
de PL/SQL.
PL/SQL dispone de distintos tipos de bloque. Estos bloques a su vez, pueden llamar a otros
bloques dentro de los mismos. Hay 3 tipos de bloques:
1. Bloques anónimos
2. Procedimientos
3. Funciones
Bloques anónimos: Los bloques anónimos son bloques justamente “sin nombre”. Este tipo
de bloques no quedan almacenados en la base de datos y tienen que ser ejecutados cada
vez que se requiera de su lógica. Pueden ser almacenados en archivos “SQL” y ejecutados
las veces que se necesitan. Estos bloques dejan de existir luego de su ejecución.
✓ “A la vieja ultranza”
✓ “Herramienta de Debut”
Al principio todo parece más complicado, pero créeme que con el tiempo ya te vas a ir
poniendo canchero en identificar donde están los problemas.
• SET SERVEROUTPUT ON
Y el comando que muestra el mensaje es un Oracle package y procedure dentro del mismo,
o sea…
• SET SERVEROUTPUT ON
….
✓ Reusabilidad
Las variables son utilizadas para almacenar información y manipular valores almacenados.
La sentencia anterior retorna el first_name y el department_id y luego debemos almacenar
estos valores. Para ello se pueden utilizar 2 variables distintas, para almacenaer dicha
información. Las variables pueden almacenar otras variables, otros tipos de datos, cursores
y subprogramas.
Identificadores
Los identificadores son utilizados para asignarle un “nombre” a una variable, y llevan una
forma de convención que se debe respetar teniendo en cuenta las siguientes reglas :
✓ El nombre no puede ser igual a una palabra reservada de Oracle, como por ejemplo
“BEGIN”
Uno puede declarar variables en la zona declarativa de cada bloque PL/SQL, subprograma,
o package. Las declaraciones alocan espacio para el valor de las mismas, especifican un
tipo de dato, y definen un nombre donde pueden ser referenciadas. Las declaraciones
también permiten asignar un valor por defecto.
En la zona de ejecución, el valor por defecto de la variable puede ser reemplazado por un
nuevo valor.
Los subprogramas pueden tener parámetros. Se pueden pasar variables como parámetros
a los subprogramas.
es asignado en esta última sección. Todo lo que es string o VARCHAR2 tiene que
ir entre comillas simples. El procedimiento PUT_LINE es invocado utilizando la
variable “Myname”. El valor de la variable es concatenado con el string “My name is
:”. La salida de este bloque anónimo es :
My name is:
Tipos de Variables
Todas las variables llevan un “tipo” de datos. Si queremos que la variable almacene :
4. Un valor string o de caracteres como por ejemplo “Atlanta” el tipo de dato será
“VARCHAR2”.
En lugar de utilizar un harcoding para definir un tipo de datos y precisión de una variable,
se puede utilizar el atributo “%TYPE”, que permite que se defina una variable con el tipo de
dato de otra variable, o bien con una columna de una tabla de la base de datos.
Declarar variables para almacenar el balance de una cuenta bancaria, y también el mínimo
balance, que es 1000. La variable min_balance es definida para que tenga el mismo tipo de
dato que la variable “balance”. El atributo “%TYPE” provee el tipo de dato de la variable.
Una columna de base de datos del tipo “NOT NULL” no aplica como restricción a variables
que estan declaradas con el %TYPE. Es decir…
Variable : v_employee_id
Sustitución de Variables
Se utiliza el carácter “&” antes del nombre de la variable. De esta forma evitamos hacer un
hard coding del valor, o sea, poner un valor fijo para cuando se ejecuta la sentencia. Brinda
mayor flexibilidad.
Veamos un ejemplo…
En el ambiente de iSQL*Plus, las variables de sustitución pueden ser utilizadas para pasar
valores en tiempo de ejecución en los bloques de PL/SQL. Se puede referenciar variables
de sustitución en la sentencias de SQL poniendo el carácter ”&” como prefijo antes del
nombre de la variable. El valor del texto es sustituido en el bloque PL/SQL antes de que el
mismo sea ejecutado. Sin embargo, no se puede asignar varios valores en una misma
corrida a la misma variable.
1. Cuando uno ejecuta el bloque, iSQL*Plus muestra por pantalla el mensaje para
ingresar un valor a “empno”, que es la variable de sustitución. Por defecto el mensaje
que se muestra es “Enter value for <substitution variable>”. Luego hacer click en el
botón de “Continue”.
2. En este segundo punto, se puede observar la salidad por pantalla del valor de la
variable y del resultado de la consulta. Observemos que aparece tanto el valor
antiguo como el nuevo.
3. Si queremos que no aparezcan los valores de la variable por pantalla y solo el
resultado de la consulta podemos ejecutar este comando.
SET VERIFY OFF.
Aclaración: En el Oracle Express, en lugar de utilizar el “&”, tenes que utilizar dos
puntos “:”, este es una pequeña diferencia que hay con la interfaz que usamos en el
curso, son cosas pequeñas que cambian entre interfaz e interfaz, pero esta es una
de ellas.
Oracle PL/SQL provee 2 formas de comentar código, o poner comentarios para que el
mismo sea mas entendible de leer y analizar.
1. La primera de ellas es utilizando “- -“, doble guión sobre la línea o las líneas que
queremos comentar.
2. Si queremos comentar un párrafo es más fácil utilizar “/* */”.
Funciones en PL/SQL
Las funciones de fila que seguramente aprendiste en SQL pueden ser utilizadas en PL/SQL,
te acordas cuáles eran ?.
1. LENGTH
2. UPPER
3. LOWER
4. INITCAP
5. SUBSTR
6. Etc
Recordá también que estas se aplican sobre cada registro a un campo en particular.
A veces es necesario convertir por ejemplo, un tipo de dato VARCHAR2 a number, para
realizar una operación, o por ejemplo un VARCHAR2 a un tipo DATE y compara fechas.
Operadores en PL/SQL
1. Lógicos
2. Aritméticos
3. Concatenación
4. Paréntesis que controla el orden de operación
Operadores…
• +,-
• *, /
• ||
• =, <, >, <=, >=, <>, !=, IS NULL,LIKE, BETWEEN,IN
• NOT
• AND
• OR
Ejemplos de operadores…
Es sumamente importante, que aprendas a codificar como sugiere los stándares de Oracle.
n un bloque PL/SQL utilizamos sentencias de SQL para mostrar filas por pantalla y también
para poder modificar esos registros de las tablas de la base de datos. Podemos utilizar
comandos DML (Data Manipulation Language – Lenguaje de Manipulación de Información)
y comandos de control de transacciones. Cuando utilicemos los comandos DML y de control
de transacción tengamos en cuenta lo siguiente:
✓ La sentencia “END;” marca el final del bloque PL/SQL no el final de una transacción.
Un bloque puede abarcar muchas transacciones. Y una transacción puede abarcar
varios bloques.
BEGIN
END;
El ejemplo utilize directamente una sentencia DDL en el bloque. Cuando uno ejecuta el
bloque el error que desplegará Oracle será:
ERROR at lime 5:
PLS-00103: Encountered the symbol “CREATE” when expecting one of the following:
BEGIN
employees’;
END;
Sin embargo, otras sentencias de tipo DCL si son soportadas. Se utiliza las sentencias de
control de transacción también para afirmar los cambios en la base de datos y que se hagan
permanentes o que se puedan deshacer. COMMIT, ROLLBACK, y SAVEPOINT son 3
sentencias que son utilizadas en el DCL. COMMIT hace efectivas las transacciones en la
DB. ROLLBACK deshace las transacciones realizadas luego del último COMMIT.
SAVEPOINT es utilizada para marcar un punto intermedio en el proceso de transacciones.
Los comandos de control de transacción son válidos en PL/SQL y pueden ser utilizados
directamente en la sección de “ejecución de un bloque” de PL/SQL.
SELECT. Se debe especificar una variable por cada ítem que se encuentre en el SELECT,
y el orden de las variables se corresponde con el orden de los ítems en el SELECT. Utilizar
el INTO para asignar las variables utilizadas en PL/SQL.
Las sentencias SELECT en los bloques PL/SQL cumplen con la clasificación ANSI del SQL,
donde se aplica la siguiente regla: los queries solo retornan una fila. El query que retorna
más de una, o no retorna ninguna genera un error.
PL/SQL gestiona este tipo de errores utilizando el manejo de excepciones, que pueden ser
capturadas en la sección de “exceptions” con las siguientes excepciones:
• NO_DATA_FOUND
• TOO_MANY_ROWS
Se puede incluir una condición en el WHERE en la sentencia SQL, para que la misma
retorne una sola fila.
Nota: La sentencia SELECT con una cláusula INTO retorna una sola fila. Si el requerimiento
es retornar varias filas y operar con esta información, se deben utilizar cursores explícitos.
respectivamente. Observar como una cláusula INTO, con las sentencias SELECTs, asigna
valores de columna de la base de datos dentro de la variable PL/SQL.
Nota : Las funciones de grupo no pueden ser utilizadas en la sintáxis de PL/SQL. Pueden
ser usadas en las sentencias SQL en un bloque PL/SQL como se muestra en el ejemplo.
Lo que no se puede realizar es lo siguiente :
Convención de nombres
En las sentencias de PL/SQL que pueden llegar a ser ambiguas, el nombre de las columnas
de la base de datos toma precedencia sobre los nombre de las variables locales. El ejemplo
siguiente, retorna el hire_date (fecha de contratación) y la fecha de hoy de la tabla
employees del empleado_id = 176.
Centro de e-Learning SCEU UTN - BA.
Medrano 951 2do piso (1179) // Tel. +54 11 4867 7589 / Fax +54 11 4032 0148
www.sceu.frba.utn.edu.ar/e-learning
p. 36
Esta consulta genera un error en tiempo de ejecución, porque el nombre de las variables
es exactamente igual al nombre de las columnas de la tabla de la base de datos.
✓ Identificar las tablas del modelo de datos que se utilizarán en este curso
✓ Sustitución de Variables
✓ Literales
✓ Operadores
✓ Cursores Implícitos
Ejercicio 1
• BEGIN
END;
• DECLARE
amount NUMBER(10);
END;
• DECLARE
BEGIN
END;
• DECLARE
Amount NUMBER(10);
BEGIN
DBMS_OUTPUT.PUT_LINE(amount);
END;
Ejercicio 2
Ejecutar un bloque anónimo que muestre por pantalla el tradicional “Hello World”.
Ejercicio 3
• Sección declarativa.
• Declaración de variables.
• Declaración de variables utilizando atributo “%TYPE”.
• Sección de ejecución.
Centro de e-Learning SCEU UTN - BA.
Medrano 951 2do piso (1179) // Tel. +54 11 4867 7589 / Fax +54 11 4032 0148
www.sceu.frba.utn.edu.ar/e-learning
p. 40
1. today
2. last_name
3. today’s_date
4. Number_of_days_in_February_this_year
5. Isleap$year
6. #number
7. NUMBER#
8. number1to7
Ejercicio 5
Ejercicio 6
SET SERVEROUTPUT ON
DECLARE
Fname VARCHAR2(20);
BEGIN
Centro de e-Learning SCEU UTN - BA.
Medrano 951 2do piso (1179) // Tel. +54 11 4867 7589 / Fax +54 11 4032 0148
www.sceu.frba.utn.edu.ar/e-learning
p. 41
END;
Ejercicio 7
Hello World
Tomorrow Is : 13-Ene-04
Ejercicio 1
La respuesta correcta es la D.
El bloque C tiene todas las partes pero no tiene sentencias en la sección de “ejecución”.
Ejercicio 2
SET SERVEROUTPUT ON
BEGIN
DBMS_OUTPUT.PUT_LINE('Hello World');
END;
Ejercicio 3
Ejercicio 4
1. today
2. last_name
3. today’s_date
4. Number_of_days_in_February_this_year
5. Isleap$year
6. #number
7. NUMBER#
Centro de e-Learning SCEU UTN - BA.
Medrano 951 2do piso (1179) // Tel. +54 11 4867 7589 / Fax +54 11 4032 0148
www.sceu.frba.utn.edu.ar/e-learning
p. 43
8. number1to7
1. Es válido
2. Es válido
3. Inválido. El carácter simple no es válido.
4. Inválido. Muchos caracteres de largo.
5. Válido.
6. Inválido. No puede comenzar con #.
7. Válido.
8. Válido.
Ejercicio 5
Ejercicio 6
SET SERVEROUTPUT ON
DECLARE
Fname VARCHAR2(20);
BEGIN
END;
Ejercicio 7
DECLARE
tomorrow today%TYPE;
BEGIN
tomorrow := today + 1;
DBMS_OUTPUT.PUT_LINE(‘Hello World’);
DBMS_OUTPUT.PUT_LINE(‘TODAY IS :’ || today);
DBMS_OUTPUT.PUT_LINE(‘TOMORROW IS :’ || tomorrow);
END;
Lo que vimos:
En esta unidad, conocimos los primeros conceptos para programar en bases de
datos relacionales. Aprendimos la parte declarativa y algunas sentencias básicas
de programación, y también como comentar código cuando es necesario hacerlo.
Lo que viene:
Ahora pasaremos a conocer como interactuar con Oracle Server y aprenderemos
como escribir distintas estructuras de control y lo que son los cursores explícitos.
¡Avancemos!