Oracle Procedimientos almacenados y funciones de PL/SQL con ejemplos
โก Resumen inteligente
Los subprogramas PL/SQL son bloques, procedimientos y funciones con nombre, que se almacenan en la base de datos y se invocan por su nombre. Un procedimiento ejecuta un proceso y una funciรณn devuelve un valor; ambos intercambian datos mediante los parรกmetros IN, OUT e IN OUT, y la palabra clave RETURN.

ยฟQuรฉ son los subprogramas PL/SQL?
En este tutorial, verรก una descripciรณn detallada de cรณmo crear y ejecutar los bloques, procedimientos y funciones mencionados.
Los procedimientos y las funciones son subprogramas que se pueden crear y guardar en la base de datos como objetos de base de datos. Tambiรฉn se pueden llamar o referenciar dentro de otros bloques.
Tambiรฉn cubrimos las principales diferencias entre estos dos subprogramas y analizamos las Oracle funciones integradas.
Terminologรญas en subprogramas PL/SQL
Antes de aprender sobre los subprogramas PL/SQL, analizaremos la terminologรญa que forman parte de estos subprogramas.
Parรกmetro
Un parรกmetro es una variable o marcador de posiciรณn de cualquier valor vรกlido. Tipo de datos PL/SQL a travรฉs del cual el subprograma PL/SQL intercambia valores con el cรณdigo principal. Este parรกmetro permite la entrada a los subprogramas y extracciรณn de valores de ellos.
- Estos parรกmetros deben definirse junto con los subprogramas en el momento de su creaciรณn.
- Se incluyen en la instrucciรณn de llamada para interactuar con los subprogramas.
- El tipo de datos del parรกmetro en el subprograma y en la instrucciรณn que lo llama deben ser iguales.
- No se debe mencionar el tamaรฑo del tipo de datos al declarar los parรกmetros, ya que el tamaรฑo es dinรกmico.
En funciรณn de su finalidad, los parรกmetros se clasifican de la siguiente manera:
- EN Parรกmetro
- Parรกmetro de salida
- Parรกmetro ENTRADA SALIDA
EN Parรกmetro
- Se utiliza para proporcionar datos de entrada a los subprogramas.
- Es una variable de solo lectura dentro de los subprogramas; su valor no se puede cambiar dentro del subprograma.
- En la instrucciรณn de llamada, puede ser una variable, un valor literal o una expresiรณn, como '5*8' o 'a/b'.
- Por defecto, los parรกmetros son de tipo IN.
Parรกmetro de salida
- Se utiliza para obtener la salida de los subprogramas.
- Es una variable de lectura y escritura dentro de los subprogramas; su valor puede modificarse dentro de ellos.
- En la instrucciรณn de llamada, siempre debe haber una variable para almacenar el valor del subprograma.
Parรกmetro ENTRADA SALIDA
- Se utiliza tanto para introducir datos como para obtener resultados de los subprogramas.
- Es una variable de lectura y escritura dentro de los subprogramas; su valor puede modificarse dentro de ellos.
- En la instrucciรณn de llamada, siempre debe haber una variable para almacenar el valor del subprograma.
El tipo de parรกmetro debe especificarse al crear los subprogramas.
DEVOLUCION
RETURN es la palabra clave que indica al compilador que transfiera el control del subprograma a la instrucciรณn que lo llama. En un subprograma, RETURN simplemente significa que el control debe salir del subprograma; una vez que el controlador encuentra RETURN, el cรณdigo que le sigue se omite.
Normalmente, el bloque principal llama a los subprogramas, y el control pasa del bloque principal al subprograma llamado. La instrucciรณn RETURN en el subprograma devuelve el control al bloque principal. En el caso de las funciones, la instrucciรณn RETURN tambiรฉn devuelve un valor, cuyo tipo de dato se especifica al declarar la funciรณn.
ยฟQuรฉ es un procedimiento en PL/SQL?
A Procedimiento En PL/SQL, una unidad de subprograma consta de un grupo de sentencias PL/SQL que se pueden llamar por su nombre. Cada procedimiento tiene su propio nombre รบnico y se almacena en el Oracle base de datos como objeto de base de datos.
Nota: Un subprograma no es mรกs que un procedimiento, y debe crearse manualmente segรบn los requisitos. Una vez creado, se almacena como un objeto de base de datos.
Las caracterรญsticas de una unidad de subprograma de procedimiento en PL/SQL son:
- Los procedimientos son bloques independientes que se pueden almacenar en el base de datos de CRISPR Medicine News.
- Se les puede llamar por su nombre para ejecutar las sentencias PL/SQL.
- Se utilizan principalmente para ejecutar un proceso.
- Pueden contener bloques anidados, o estar anidados dentro de otros bloques o paquetes.
- Contienen una parte de declaraciรณn (opcional), una parte de ejecuciรณn y una parte de manejo de excepciones (opcional).
- Los valores se pueden pasar a un procedimiento o recuperarse de รฉl mediante parรกmetros.
- Estos parรกmetros deben incluirse en la declaraciรณn de llamada.
- Un procedimiento puede tener una instrucciรณn RETURN para devolver el control al bloque que lo llama, pero no puede devolver ningรบn valor a travรฉs de RETURN.
- Los procedimientos no se pueden llamar directamente desde las sentencias SELECT; se pueden llamar desde otro bloque o mediante la palabra clave EXEC.
Sintaxis
CREATE OR REPLACE PROCEDURE <procedure_name> ( <parameter1 IN/OUT <datatype> .. . ) [ IS | AS ] <declaration_part> BEGIN <execution part> EXCEPTION <exception handling part> END;
- La instrucciรณn CREATE PROCEDURE le indica al compilador que cree un nuevo procedimiento. La palabra clave 'OR REPLACE' le indica que reemplace el procedimiento existente (si lo hay) con el actual.
- El nombre del procedimiento debe ser รบnico.
- La palabra clave 'IS' se usa cuando el procedimiento almacenado estรก anidado dentro de otro bloque. Si el procedimiento es independiente, se usa 'AS'. Aparte de esta norma de codificaciรณn, ambas tienen el mismo significado.
Ejemplo 1: Creaciรณn de un procedimiento y su llamada mediante EXEC. En este ejemplo, creamos un Oracle Procedimiento que toma un nombre como entrada e imprime un mensaje de bienvenida como salida, utilizando el comando EXEC para llamarlo.
CREATE OR REPLACE PROCEDURE welcome_msg (p_name IN VARCHAR2) IS BEGIN dbms_output.put_line ('Welcome '|| p_name); END; / EXEC welcome_msg ('Guru99');
Code Explicaciรณn:
- Code lรญnea 1: Se crea el procedimiento con el nombre 'welcome_msg' y un parรกmetro 'p_name' de tipo 'IN'.
- Code lรญnea 4: Imprimir el mensaje de bienvenida concatenando el nombre introducido.
- El procedimiento se ha completado correctamente.
- Code lรญnea 7: Llamando al procedimiento usando EXEC con el parรกmetro 'Guru99'. El procedimiento se ejecuta e imprime โBienvenido Guru99 ".
ยฟQuรฉ es una funciรณn?
Una funciรณn es un subprograma PL/SQL independiente. Al igual que un procedimiento, una funciรณn tiene un nombre รบnico y se almacena como un objeto de base de datos PL/SQL. Sus caracterรญsticas son:
- Las funciones son bloques independientes que se utilizan principalmente para realizar cรกlculos.
- Una funciรณn utiliza la palabra clave RETURN para devolver un valor, cuyo tipo de datos se define en el momento de su creaciรณn.
- Una funciรณn debe devolver un valor o generar una excepciรณn; la instrucciรณn return es obligatoria en las funciones.
- Una funciรณn sin sentencias DML puede llamarse directamente en una consulta SELECT, mientras que una funciรณn con DML solo puede llamarse desde otros bloques PL/SQL.
- Puede contener bloques anidados, o estar anidado dentro de otros bloques o paquetes.
- Contiene una parte de declaraciรณn (opcional), una parte de ejecuciรณn y una parte de manejo de excepciones (opcional).
- Los valores se pueden pasar a la funciรณn o recuperarse de ella a travรฉs de parรกmetros.
- Estos parรกmetros deben incluirse en la declaraciรณn de llamada.
- Una funciรณn tambiรฉn puede devolver un valor a travรฉs de parรกmetros OUT, ademรกs de utilizar RETURN.
- Dado que siempre devuelve un valor, la instrucciรณn que la llama siempre utiliza un operador de asignaciรณn para rellenar una variable.
Sintaxis
CREATE OR REPLACE FUNCTION <function_name> ( <parameter1 IN/OUT <datatype> ) RETURN <datatype> [ IS | AS ] <declaration_part> BEGIN <execution part> EXCEPTION <exception handling part> END;
- CREATE FUNCTION le indica al compilador que cree una nueva funciรณn. 'OR REPLACE' le indica que reemplace la funciรณn existente (si la hay) con la actual.
- El nombre de la funciรณn debe ser รบnico.
- Se debe mencionar el tipo de datos RETURN.
- La palabra clave 'IS' se usa cuando la funciรณn estรก anidada dentro de otro bloque. Si la funciรณn es independiente, se usa 'AS'.
Ejemplo 1: Creaciรณn de una funciรณn y su llamada mediante un bloque anรณnimo. En este programa, creamos una funciรณn que toma un nombre como entrada y devuelve un mensaje de bienvenida, utilizando un bloque anรณnimo y una instrucciรณn SELECT para llamarla.
CREATE OR REPLACE FUNCTION welcome_msg_func ( p_name IN VARCHAR2) RETURN VARCHAR2 IS BEGIN RETURN ('Welcome '|| p_name); END; / DECLARE lv_msg VARCHAR2(250); BEGIN lv_msg := welcome_msg_func ('Guru99'); dbms_output.put_line(lv_msg); END; / SELECT welcome_msg_func('Guru99') FROM DUAL;
Code Explicaciรณn:
- Code lรญnea 1: Creando la funciรณn con el nombre 'welcome_msg_func' y un parรกmetro 'p_name' de tipo 'IN'.
- Code lรญnea 2: Declarando el tipo de retorno como VARCHAR2.
- Code lรญnea 5: Devuelve el valor concatenado 'Welcome' y el valor del parรกmetro.
- Code lรญnea 8: Bloque anรณnimo para llamar a la funciรณn anterior.
- Code lรญnea 9: Declarar la variable con el mismo tipo de dato que el tipo de retorno de la funciรณn.
- Code lรญnea 11: Llamar a la funciรณn y asignar el valor de retorno a la variable 'lv_msg'.
- Code lรญnea 12: Imprimiendo el valor de la variable. La salida es โBienvenido Guru99 ".
- Code lรญnea 14: Llamando a la misma funciรณn a travรฉs de una instrucciรณn SELECT. El valor devuelto se dirige a la salida estรกndar.
Similitudes entre un procedimiento y una funciรณn
- Ambos pueden ser llamados desde otros bloques PL/SQL.
- Si una excepciรณn generada en el subprograma no se maneja en su manejo de excepciones secciรณn, se propaga al bloque de llamada.
- Ambos pueden tener tantos parรกmetros como sean necesarios.
- Ambos se tratan como objetos de base de datos en PL/SQL.
Procedimiento vs. Funciรณn: Diferencias clave
| Procedimiento | Funciรณn |
|---|---|
| Se utiliza principalmente para ejecutar un proceso determinado. | Se utiliza principalmente para realizar algรบn cรกlculo. |
| No se puede llamar en una instrucciรณn SELECT. | Una funciรณn que no contiene instrucciones DML puede ser llamada en una instrucciรณn SELECT. |
| Utiliza un parรกmetro de SALIDA para devolver un valor. | Utiliza RETURN para devolver un valor. |
| No es obligatorio devolver un valor. | Es obligatorio devolver un valor. |
| La tecla RETURN simplemente finaliza el control del subprograma. | RETURN finaliza el control del subprograma y tambiรฉn devuelve el valor. |
| El tipo de datos de retorno no se especifica en el momento de la creaciรณn. | El tipo de datos de retorno es obligatorio en el momento de la creaciรณn. |
Funciones integradas en PL/SQL
PL / SQL Contiene diversas funciones integradas para trabajar con tipos de datos de cadena y fecha. Aquรญ veremos las funciones mรกs utilizadas y su uso.
Funciones de conversiรณn
Estas funciones integradas convierten un tipo de dato en otro.
| Nombre de la funciรณn | Uso | Ejemplo |
|---|---|---|
| A_CHAR | Convierte otro tipo de dato a un tipo de dato de carรกcter. | TO_CHAR(123); |
| FECHA_HASTA (cadena, formato) | Convierte la cadena de texto dada en una fecha. La cadena debe coincidir con el formato. | TO_DATE('2015-ENE-15', 'AAAA-MON-DD'); Resultado: 1 / 15 / 2015 |
| TO_NUMBER (texto, formato) | Convierte el texto en un nรบmero con el formato especificado. En dicho formato, '9' indica la cantidad de dรญgitos. | Seleccione TO_NUMBER('1234โฒ,'9999') de dual; Resultado: 1234. Seleccione TO_NUMBER('1,234.45','9,999.99') de dual; Resultado: 1234.45 |
Funciones de cadena
Estas funciones se utilizan en el tipo de datos de caracteres.
| Nombre de la funciรณn | Uso | Ejemplo |
|---|---|---|
| INSTR(texto, cadena, inicio, ocurrencia) | Indica la posiciรณn de un texto especรญfico en la cadena dada. `text` es la cadena principal, `string` es el texto a buscar, `start` es la posiciรณn inicial (opcional) y `occurrence` es la frecuencia de apariciรณn de la cadena buscada (opcional). | Seleccione INSTR('AEROPLANE','E',2,1) de dual; Resultado: 2. Seleccione INSTR('AEROPLANE','E',2,2) de dual; Resultado: 9 (segunda apariciรณn de E) |
| SUBSTR (texto, inicio, longitud) | Devuelve el valor de la subcadena de la cadena principal. `text` es la cadena principal, `start` es la posiciรณn inicial y `length` es la longitud de la subcadena. | seleccionar substr('aeroplane',1,7) de dual; Resultado: aeropla |
| MAYรSCULAS (texto) | Devuelve el texto proporcionado en mayรบsculas. | Seleccione superior('guru99') de dual; Resultado: GURU99 |
| INFERIOR (texto) | Devuelve el texto proporcionado en minรบsculas. | Seleccione lower('AerOpLane') de dual; Resultado: aviรณn |
| INITCAP (texto) | Devuelve el texto dado con la letra inicial de cada palabra en mayรบscula. | Seleccione INITCAP('guru99') de dual; Resultado: Guru99. Seleccione INITCAP('mi historia') de dual; Resultado: Mi historia |
| LONGITUD (texto) | Devuelve la longitud de la cadena dada. | Seleccione LENGTH('guru99') de dual; Resultado: 6 |
| LPAD (texto, longitud, carรกcter de relleno) | Rellena la cadena de la izquierda con el carรกcter especificado hasta alcanzar la longitud total indicada. | Seleccione LPAD('guru99', 10, '$') de dual; Resultado: $$$$gurรบ99 |
| RPAD (texto, longitud, pad_char) | Rellena la cadena de la derecha con el carรกcter especificado hasta alcanzar la longitud total indicada. | Seleccione RPAD('guru99',10,'-') de dual; Resultado: gurรบ99โ- |
| LTRIM (texto) | Elimina el espacio en blanco inicial del texto. | Seleccione LTRIM(' Guru99') de doble; Resultado: Guru99 |
| RTRIM (texto) | Elimina el espacio en blanco final del texto. | Seleccione RTRIM('Guru99') de dual; Resultado: Guru99 |
Funciones de fecha
Estas funciones se utilizan para manipular fechas.
| Nombre de la funciรณn | Uso | Ejemplo |
|---|---|---|
| AรADIR_MESES (fecha, nรบmero de meses) | Agrega los meses indicados a la fecha. | AGREGAR_MESES('2015-01-01',5); Resultado: 05 / 01 / 2015 |
| FECHA DEL SISTEMA | Devuelve la fecha y hora actuales del servidor. | Seleccione SYSDATE de dual; Resultado: 10/4/2015 2:11:43 |
| TRUNC | Redondea la variable de fecha hacia abajo al valor mรกs bajo posible. | seleccione sysdate, TRUNC(sysdate) de dual; Resultado: 10/4/2015 2:12:39 PM, 10/4/2015 |
| REDONDA | Redondea la fecha al lรญmite mรกs cercano, ya sea mayor o menor. | Seleccione sysdate, REDONDEAR(sysdate) de dual; Resultado: 10/4/2015 2:14:34 PM, 10/5/2015 |
| MESES_ENTRE | Devuelve el nรบmero de meses entre dos fechas. | Seleccione MENTHS_BETWEEN (sysdate+60, sysdate) de dual; Resultado: 2 |


