Está en la página 1de 40

PROYECTO

MANUAL DE PL/SQL PARA PRINCIPIANTES

Universidad Tecnolgica Costarricense

Contenido
Conceptos Bsicos y definicin de PL/SQL ...................................................... 3
Que es PL/SQL .................................................................................................. 3
Caractersticas de PL/SQL ................................................................................. 4
Bloques PL/SQL ................................................................................................. 4
Tipos de Bloques................................................................................................ 5
Tipos de Datos Oracle/PL-SQL .......................................................................... 6
Identificadores .................................................................................................... 8
Operadores ........................................................................................................ 8
Clave primaria .................................................................................................... 9
Llavefornea..................................................................................................... 10
Unique .............................................................................................................. 11
ndices .............................................................................................................. 11
Secuencias ....................................................................................................... 12
Funciones y Procedimientos ............................................................................ 13
Procedimientos................................................................................................. 13
Funciones ......................................................................................................... 14
Cursores ........................................................................................................... 17
Vistas ............................................................................................................... 19
Paquetes .......................................................................................................... 21
Triggers ............................................................................................................ 22
Ejemplos varios en PL/SQL.............................................................................. 25
Resuelva los siguientes ejercicios: ................................................................... 31
Solucionario...................................................................................................... 33

Universidad Tecnolgica Costarricense

Conceptos Bsicos y definicin de PL/SQL

Que es PL/SQL

PL-SQL es el lenguaje de programacin que viene incrustado en la Base de Datos


Oracle, sus siglas en ingls corresponden a Procedural Language

StructuredQueryLanguage y al espaol se puede traducir como Lenguaje de


Procedimiento Lenguaje de Consulta Estructurado.
El lenguaje PL-SQL permite soportar todas las consultas a la Base de Datos
Oracle, ya que para manipular los datos se usan las mismas instrucciones del
lenguaje SQL estndar usado en las Bases de Datos.
PL-SQL es un lenguaje que est estructurado en bloques de cdigo, los que son
utilizados para construir PL-SQL Packages en Oracle, PL-SQL Procedures en
Oracle, PL-SQL Function en Oracle y scripts de cdigo.
Los desarrolladores pueden construir sus bloques PL-SQL y almacenarlos como
objetos en el entorno de la Base de Datos Oracle. Estos programas o paquetes en
PL-SQL son ejecutados en el servidor lo que permite ahorrar recursos en el
entorno del cliente.
Los programas o PL-SQL Packages en Oracle solo pueden ser accesados o
ejecutados por los usuarios debidamente autorizados.

Universidad Tecnolgica Costarricense

Caractersticas de PL/SQL

Bloques PL-SQL
Tipos de Bloques
Tipos de Datos Oracle/PL-SQL
Identificadores
Operadores
Variables
Constantes

Bloques PL/SQL

Un programa de PL/SQL est compuesto por bloques. Un programa est


compuesto como mnimo de un bloque. Los bloques de PL/SQL pueden ser de los
siguientes tipos:
Bloques annimos
Subprogramas
Estructura de un Bloque
Los bloques PL/SQL presentan una estructura especfica compuesta de tres
partes bien diferenciadas:
La seccin declarativa: en donde se declaran todas las constantes y
variables que se van a utilizar en la ejecucin del bloque.
La seccin de ejecucin: que incluye las instrucciones a ejecutar en el
bloque PL/SQL.
La seccin de excepciones: en donde se definen los manejadores de
errores que soportar el bloque PL/SQL.

Universidad Tecnolgica Costarricense

Cada una de las partes anteriores se delimita por una palabra reservada, de modo
que un bloque PL/SQL se puede representar como sigue:

Tipos de Bloques

Los bloques PL/SQL son de varios tipos:


Annimos (Anonymous blocks): Se construyen de forma dinmica y se
ejecutan una sola vez.
Con nombre (Named blocks): Son bloques con nombre, que al igual que
el anterior se construyen, generalmente, de forma dinmica y se ejecutan
una sola vez.
Subprogramas: Procedimientos, paquetes o funciones almacenados en la
BD. No suelen cambiar despus de su construccin y se ejecutan mltiples
veces mediante una llamada call.

Universidad Tecnolgica Costarricense

Disparadores (Triggers): Son bloques con nombre que tambin se


almacenan en la BD. Tampoco suelen cambiar despus de su construccin
y se ejecutan varias veces. Se ejecutan de forma automtica ante algn
suceso de disparo, que ser una orden del lenguaje de manipulacin de
datos (INSERT, UPDATE o DELETE) que se ejecuta sobre una tabla de la
BD.

Tipos de Datos Oracle/PL-SQL

Cada constante y variable tiene un tipo de dato en el cual se especifica el formato


de almacenamiento, restricciones y rango de valores validos.
PL/SQL proporciona una variedad predefinida de tipos de datos. Casi todos los
tipos de datos manejados por PL/SQL son similares a los soportados por SQL.

Los tipos de datos ms comunes:


VARCHAR2:Almacena datos de tipo carcter empleando slo la cantidad
necesaria an cuando la longitud mxima sea mayor.

BOOLEAN: Se emplea para almacenar valores TRUE o FALSE.

Universidad Tecnolgica Costarricense

DATE: Almacena datos de tipo fecha. Las fechas se almacenan


internamente como datos numricos, por lo que es posible realizar
operaciones aritmticas con ellas.

NUMBER: Almacena nmeros enteros o de punto flotante, virtualmente de


cualquier longitud, aunque puede ser especificada la precisin (Nmero de
dgitos) y la escala que es la que determina el nmero de decimales.

CHAR: Almacena datos de tipo carcter con una longitud mxima de 32767
y cuyo valor de longitud por default es.

Atributos de tipo: Un atributo de tipo PL/SQL es un modificador que puede


ser usado para obtener informacin de un objeto de la base de datos. El
atributo %TYPE permite conocer el tipo de una variable, constante o campo
de la base de datos. El atributo %ROWTYPE permite obtener los tipos de
todos los campos de una tabla de la base de datos, de una vista o de un
cursor.

Universidad Tecnolgica Costarricense

Identificadores

Se emplean para dar nombre a los objetos PL/SQL, tales como variables,
cursores, tipos y subprogramas.
Los identificadores constan de una letra, seguida por una secuencia opcional de
caracteres, que pueden incluir letras, nmeros, signos de dlar ($), caracteres de
subrayadoy smbolos de almohadilla (#). Los dems caracteres no pueden
emplearse. La longitud mximade un identificador es de 30caracteres.
Ejemplosvalidos
X,Y, CodEmpleado, V1, V2_, ES_UNA_VARIABLE_#

Operadores

TIPO DE OPERADOR

OPERADORES

Asignacin

:= (dos puntos + igual)

+ (suma)
- (resta)
Aritmticos

* (multiplicacin)
/ (divisin)
** (exponente)

Universidad Tecnolgica Costarricense

= (igual a)
<> (distinto de)
Relacionales o de Comparacin

< (menor que)


> (mayor que)
>= (mayor o igual a)
<= (menor o igual a)

AND (y lgico)
Lgicos

NOT (negacin)
OR (o lgico)

Concatenacin

||

Clave primaria

La clave primaria se utiliza para identificar en forma nica cada lnea en la tabla.
Puede ser parte de un registro real, o puede ser un campo artificial (uno que no
tiene nada que ver con el registro real). Una clave primaria puede consistir en uno

Universidad Tecnolgica Costarricense

o ms campos en una tabla. Cuando se utilizan mltiples campos como clave


primaria, se los denomina claves compuestas.
Las claves primarias pueden especificarse cuando se crea la tabla:

O cambiando la estructura existente de la tabla utilizando ALTER TABLE.

Llave fornea

Una llave externa es un campo (o campos) que seala la llave primaria de otra
tabla. El propsito de la llave fornea es asegurar la integridad referencial de los
datos. En otras palabras, slo se permiten los valores que se esperan que
aparezcan en la base de datos.

10

Universidad Tecnolgica Costarricense

Unique
Una restriccin Unique (nico) asegura que el campo o campos en los que dicha
restriccin se aplica para un registro tendrn un valor diferente con respecto a
cualquier otro registro de la tabla. La restriccin Unique es similar a una
clave primaria, pero no es necesario que los campos con este tipo de restricciones
tengan valores. Si la restriccin est compuesta por ms de un campo, algunos de
ellos pueden tener valores nulos siempre y cuando la combinacin de campos siga
siendo nica en la tabla.

ndices

Un ndice es una estructura de datos que permite acceder a diferentes filas de una
misma tabla a travs de un campo (o campos clave).Un ndice permite un acceso
mucho ms rpido a los datos.

Las sentencias de SQL para manipular ndices son:

La sintaxis para la creacin de ndices es la siguiente:

11

Universidad Tecnolgica Costarricense

La palabra clave UNIQUE especifica que no pueden existir claves duplicadas en el


ndice.ASC | DESC especifican el criterio de ordenacin elegido, ascendente o
descendente, por defecto es ascendente.

En la siguiente imagen se muestra como se crea o elimina un ndex.

Los ndices usados por las restricciones "primarykey" y "unique" no pueden


eliminarse con "dropindex", se eliminan automticamente cuando quitamos la
restriccin.
Si eliminamos una tabla, todos los ndices asociados a ella se eliminan.

Secuencias
Las secuencias (sequences) son objetos que facilitan la generacin automtica de
series numricas.
Los usos ms frecuentes de las secuencias, son:

La generacin automtica de claves primarias

Coordinar las claves de mltiples filas o tablas.

12

Universidad Tecnolgica Costarricense

Las secuencias son independientes de las tablas; por tanto, una misma secuencia
se puede usar para generar valores de columnas numricas de una o ms tablas.
Ejemplo de creacin de secuencia:

Funciones y Procedimientos

Procedimientos
Un procedimiento es un subprograma que ejecuta una accin especfica y que no
devuelve ningn valor. Un procedimiento tiene un nombre, un conjunto de
parmetros (opcional) y un bloque de cdigo.
Sintaxis de los procedimientos:

Ejemplo:

13

Universidad Tecnolgica Costarricense

Funciones

Una funcin es un bloque nombrado PL/SQL que devuelve un valor, puede


estar almacenada en la B.D., como objeto de la B.D., para repetidas
ejecuciones. Una funcin puede ser llamada como parte de una expresin.

Sintaxis de las funciones:

Descripcin de la sintaxis:

14

Universidad Tecnolgica Costarricense

Nombre-parmetro: es el nombre que queramos dar al parmetro.


Podemos utilizar mltiples parmetros. En caso de no necesitarlos,
podemos omitir los parntesis.

IN: especifica que el parmetro es de entrada y que por tanto dicho


parmetro tiene que tener un valor en el momento de llamar a la funcin
o procedimiento. Si no se especifica nada, los parmetros son por
defecto de tipo entrada.

OUT: especifica que se trata de un parmetro de salida. Son parmetros


cuyo valor es devuelto despus de la ejecucin el procedimiento al
bloque PL/SQL que lo llam. Las funciones PLSQL no admiten
parmetros de salida.

IN OUT: Son parmetros de entrada y salida a la vez.

Tipo-de-dato: Indica el tipo de dato PLSQL que corresponde al


parmetro (NUMBER, VARCHAR2, etc).

Ejemplo:

Cuando se crea un procedimiento o funcin, Oracle automticamente compila el


cdigo fuente, guarda el cdigo objeto en un rea compartida de la SGA (System
Global Area) y almacena tanto el cdigo fuente como el cdigo objeto en catlogos
del diccionario de datos.
El cdigo objeto permanece en la SGA, por tanto, los procedimientos o funciones
se ejecutan ms rpidamente y lo pueden compartir muchos usuarios. Cuando es

15

Universidad Tecnolgica Costarricense

necesario liberar reas de la SGA, Oracle aplica el algoritmo menos-usadorecientemente. Si en un momento determinado se libera el rea SQL de un
procedimiento o funcin, la prxima vez que se ejecute se vuelve a cargar el
cdigo objeto, que est almacenado en catlogo, en la SGA.

Llamadas a procedimientos
Desde otro procedimiento, funcin y triggers

Llamadas a funciones
Desde otro procedimiento, funcin y triggers

Desde un bloque annimo

Desde una instruccin SQL

16

Universidad Tecnolgica Costarricense

Cursores

Los cursores permiten realizar operaciones sobre los registros devueltos por una
sentencia Select. La utilizacin de cursores es necesaria cuando:

Se necesita tratamiento fila a fila

En sentencias SELECT que devuelven ms de una fila

Operaciones con cursores


Declare

Se declara el cursor asignndole nombre y asocindole a una consulta.

Open

Abre el cursor y lo inicializa para que devuelva las filas.

Ejecuta la consulta asociada al cursor.

Fetch

Lee los datos del cursor con la sentencia FETCH.

Devuelve la siguiente fila en el conjunto activo.

Los datos devueltos se almacenan en variables de control o en un registro.


FETCH ... INTO ...

Close

Desactiva el cursor y libera los recursos. CLOSE cursor_1;

17

Universidad Tecnolgica Costarricense

Declaracin del cursor: lo tenemos que declarar en la zona de declaraciones,


con el siguiente formato:

Apertura del cursor: Deber colocarse en la zona de instrucciones, con el


siguiente formato:

Al hacerlo se ejecuta automticamente la sentencia select y sus resultados se


almacenan en las estructuras internas de memoria manejadas por el cursor.
Recogida de informacin: Para recuperar la informacin anteriormente guardada
en las estructuras de memoria interna tenemos que usar el siguiente formato:

Si tenemos una nica variable que recoge los datos de todas las columnas, el
formato de la variable sera el siguiente:

Si tenemos una lista de variables, cada una recoger la columna correspondiente


de la clusula select, por lo que sern del mismo tipo que las columnas.
Cierre del cursor:

18

Universidad Tecnolgica Costarricense

Ejemplos de cursor:

Vistas
Una vista es un objeto. Una vista es una alternativa para mostrar datos de varias
tablas; es como una tabla virtual que almacena una consulta. Los datos accesibles
a travs de la vista no estn almacenados en la base de datos, en la base de
datos se guarda la definicin de la vista y no el resultado de ella.

19

Universidad Tecnolgica Costarricense

La sintaxis bsica para crear una vista es la siguiente:

El contenido de una vista se muestra con un "select":

Por qu usar Vistas?

Para restringir el acceso a la B.D.

Para realizar consultas complejas de manera fcil.

Para obtener una independencia de los datos

Para presentar diferentes vistas de los mismos datos.

20

Universidad Tecnolgica Costarricense

Paquetes
Un paquete es una estructura que agrupa objetos de PL/SQL compilados
(procedures, funciones, variables, tipos, entre otros) en la base de datos. Esto nos
permite agrupar la funcionalidad de los procesos en programas.
Los Paquetes estn divididos en 2 partes: especificacin (obligatoria) y cuerpo (no
obligatoria). La especificacin o encabezado es la interfaz entre el Paquete y las
aplicaciones que lo utilizan y es all donde se declaran los tipos, variables,
constantes, excepciones, cursores, procedimientos y funciones que podrn ser
invocados desde fuera del paquete.
.
Para crear la especificacin de un paquete la sintaxis general es la siguiente:

En el cuerpo del paquete se implementa la especificacin del mismo. El cuerpo


contiene los detalles de implementacin y declaraciones privadas, mantenindose
todo esto oculto a las aplicaciones externas, siguiendo el conocido concepto de
caja

negra.

Slo

las

declaraciones

hechas en la especificacin del paquete son visibles y accesibles desde fuera del
paquete (por otras aplicaciones o procedimientos almacenados) quedando los

21

Universidad Tecnolgica Costarricense

detalles de implementacin del cuerpo del paquete totalmente ocultos e


inaccesibles para el exterior.
La sintaxis general para crear el cuerpo de un paquete es muy parecida a la de la
especificacin, tan solo se aade la palabra clave BODY, y se implementa el
cdigo de los subprogramas.

Triggers
Un trigger o disparador es un bloque PL/SQL asociado a una tabla, que se
ejecuta como consecuencia de una determinada instruccin SQL (una operacin
DML: INSERT, UPDATE o DELETE) sobre dicha tabla.

22

Universidad Tecnolgica Costarricense

Temporalidad del Evento: AFTER / BEFORE


BEFORE: Se ejecutan la accin asociada antes de que la sentencia sea
ejecutada.

Decidir si la accin debe realizarse o no

Utilizar valores alternativos para la sentencia

AFTER

Ejecutan la accin asociada despus de que se haya ejecutado la sentencia

Ejemplo creacin de trigger

23

Universidad Tecnolgica Costarricense

Utilizacin de :OLD y :NEW


Dentro del mbito de un trigger disponemos de las variables OLD y NEW. Estas
variables se utilizan del mismo modo que cualquier otra variable PL/SQL, con la
salvedad

de

que

no

es necesario

declararlas, son

de

tipo %ROWTYPE y contienen una copia del registro antes (OLD) y despus(NEW)
de la accin SQL (INSERT, UPDATE, DELTE) que ha ejecutado el trigger.
Utilizando esta variable podemos acceder a los datos que se estn insertando,
actualizando o borrando.

24

Universidad Tecnolgica Costarricense

Ejemplos varios en PL/SQL


1. Crear una vista que se llame DETALLE_PAGOS_CREDITO que contenga
el nombre del cliente, apellidos, monto que adeuda y la mensualidad de
todos los tipos de pago que sean a crdito.

2. Escribir un bloque PL/SQL que cuente el nmero de filas que hay en la


tabla clientes, y guarde el resultado en la variable v_contador.

3. Realizar un procedimiento que permita sumar dos nmeros y guardarlo en


una variable llamada SUMA.

25

Universidad Tecnolgica Costarricense

4. Crear una funcin que reciba una fecha y devuelva el ao, en nmero, de la
fecha proporcionada y lo registre en una tabla temp.

5. Crear un procedimiento que permita borrar un empleado, a partir del cdigo


del empleado como parmetro de entrada.

6. Crear un procedimiento que permita insertar un estado en una tabla


llamada TM_ESTADO

26

Universidad Tecnolgica Costarricense

7. Crear un procedimiento que muestre el nombre y la fecha de ingreso de los


empleados ordenados por nombre, para ello utilice un cursor.

Salida al ejecutarlo:

8. Crear un trigger llamado AUDITAR_EMP_MOVIM, que permita llevar una


bitcora de las operaciones de insercin o borrado de datos que se realicen
en la tabla emp segn las siguientes especificaciones:

Crear una tabla llamada bitacora_emp con un campo tipo varchar


llamado detalle

El trigger se debe crear para que registre en la bitcora antes de que


la accin a realizar se ejecute, utilizando un before.

27

Universidad Tecnolgica Costarricense

Cuando se produzca cualquier manipulacin se insertar una fila en


dicha tabla que contendr: Fecha, nmero de empleado, y el tipo de
operacin realizada.

Creacin de la tabla:

Creacin del trigger:

Cuanto se ejecuta una accin de eliminacin o insercin en la tabla emp, se


dispara el trigger y registra en la tabla bitcora como se muestra en la imagen:

28

Universidad Tecnolgica Costarricense

9. Crear un paquete completo para dar mantenimiento a los departamentos


de la tabla DEPT. El paquete se llamar mantenimientos_deptos y deber
incluir, los siguientes subprogramas:

registrar_depto:
procedimiento

permite
recibe

insertar un departamento nuevo. El

el

nombre

la

localidad

del

nuevo

departamento.

borrar_depto: permite borrar un departamento.

modificar_loc_depto: modifica la localidad del departamento. El


procedimiento recibir el nmero del departamento a modificar y la
nueva localidad.

mostrar_depto: mostrara los datos de un departamento cuyo nmero


se pasar como parmetro.

Creacin de la cabecera:

29

Universidad Tecnolgica Costarricense

Creacin de cuerpo:

30

Universidad Tecnolgica Costarricense

Resuelva los siguientes ejercicios:

1. Cree una secuencia llamada SEQ_TEMP, que inicie en 1


2. Actualizar los vendedores con una comisin mayor que $350 con un
incremento del 15% de su salario. Si la operacin afecta a ms de tres
empleados, deshacer la transaccin, en cualquier otro caso validar la
transaccin
3. Insertar en la tabla TEMP 100 filas. En la primera columna se insertar un
ndice secuencial (1, 2, 3...) y en la segunda columna un comentario
indicando si el nmero generado es par o impar.
4. Crear la funcin BAJA_DEPT con un argumento. Dado un nmero de
departamento, borrarlo.
5. Crear la funcin ALTA_DEPT con tres argumentos: nmero, nombre y
localidad del departamento. Este procedimiento debe comprobar que los
nmeros de departamento son mltiplos de 10, si no es as dara un error
6. Crear un procedimiento utilizando cursores que muestre el nombre y el
departamento de los empleados ordenndolos por departamento.
7. Crear un trigger llamado AUDITAR_DEPT_MOVIM, que permita llevar una
bitcora de las operaciones de insercin o borrado de datos que se realicen
en la tabla DEPT segn las siguientes especificaciones:

Crear una tabla llamada bitacora_dept con un campo tipo varchar


llamado detalle

El trigger se debe crear para que registre en la bitcora despues de


que la accin a realizar se ejecute, utilizando un after.

Cuando se produzca cualquier manipulacin se insertar una fila en


dicha tabla que contendr: Fecha, nmero de departamento, nombre
del departamento, y el tipo de operacin realizada.

31

Universidad Tecnolgica Costarricense

8. Crear un paquete completo para dar mantenimiento a los empleados de la


tabla EMP. El paquete se llamar mantenimientos_empleados y deber
incluir, los siguientes subprogramas:

registrar_empleado: permite insertar un empleado nuevo. El


procedimiento recibe los datos necesarios del empleado.

borrar_empleado: permite borrar un departamento.

modificar_puesto_empleado: modificar la informacin del empleado.


El procedimiento recibir el nmero del empleado y modificara el
puesto del mismo.

mostrar_empleado: mostrara los datos de un empleado cuyo nmero


se pasar como parmetro.

9. Crear un programa que muestre el nombre y el monto del salario de los


cinco empleados que tienen el salario ms alto.
10. Crear un programa que muestre los dos empleados que ganan menos de
cada puesto.

32

Universidad Tecnolgica Costarricense

Solucionario
1. Cree una secuencia llamada SEQ_TEMP, que inicie en 1

2. Actualizar los vendedores con una comisin mayor que $350 con un
incremento del 15% de su salario. Si la operacin afecta a ms de tres
empleados, deshacer la transaccin, en cualquier otro caso validar la
transaccin

3. Insertar en la tabla TEMP 100 filas. En la primera columna se insertar un


ndice secuencial (1, 2, 3...) y en la segunda columna un comentario
indicando si el nmero generado es par o impar.

33

Universidad Tecnolgica Costarricense

4. Crear la funcin BAJA_DEPT con un argumento. Dado un nmero de


departamento, borrarlo.

5. Crear la funcin ALTA_DEPT con tres argumentos: nmero, nombre y


localidad del departamento. Este procedimiento debe comprobar que los
nmeros de departamento son mltiplos de 10, si no es as dara un error

34

Universidad Tecnolgica Costarricense

6. Crear un procedimiento utilizando cursores que muestre el nombre y el


departamento de los empleados ordenndolos por departamento.

Salida al ejecutarlo:

7. Crear un trigger llamado AUDITAR_DEPT_MOVIM, que permita llevar una


bitcora de las operaciones de insercin o borrado de datos que se realicen
en la tabla DEPT segn las siguientes especificaciones:

Crear una tabla llamada bitacora_dept con un campo tipo varchar


llamado detalle

El trigger se debe crear para que registre en la bitcora despus de


que la accin a realizar se ejecute, utilizando un after.

Cuando se produzca cualquier manipulacin se insertar una fila en


dicha tabla que contendr: Fecha, nmero de departamento, nombre
del departamento, y el tipo de operacin realizada.

35

Universidad Tecnolgica Costarricense

Creacin de la tabla:

Creacin del trigger:

Cuanto se ejecuta una accin de eliminacin o insercin en la tabla DEPT, se


dispara el trigger y registra en la tabla bitcora como se muestra en la imagen:

8. Crear un paquete completo para dar mantenimiento a los empleados de la


tabla EMP. El paquete se llamar mantenimientos_empleados y deber
incluir, los siguientes subprogramas:

36

Universidad Tecnolgica Costarricense

registrar_empleado: permite insertar un empleado nuevo. El


procedimiento recibe los datos necesarios del empleado.

borrar_empleado: permite borrar un departamento.

modificar_puesto_empleado: modificar la informacin del empleado.


El procedimiento recibir el nmero del empleado y modificara el
puesto del mismo.

mostrar_empleado: mostrara los datos de un empleado cuyo nmero


se pasar como parmetro.

Creacin de la cabecera:

Creacin del cuerpo:

37

Universidad Tecnolgica Costarricense

38

Universidad Tecnolgica Costarricense

9. Crear un programa en PL/SQL que muestre el nombre y el salario de los


cinco empleados que tienen el salario ms alto.

Salida:

10. Crear un programa en PL/SQL que muestre los dos empleados que ganan
menos de cada puesto.

39

Universidad Tecnolgica Costarricense

Salida:

40

También podría gustarte