Está en la página 1de 22

Programación de bases de datos con

PL / SQL
9-2
Usar funciones en sentencias SQL

Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos.


Objetivos
Esta lección cubre los siguientes objetivos:
-Enumere las ventajas de las funciones definidas
por el usuario en sentencias SQL

-Lista desde dónde se pueden llamar las funciones definidas


por el usuario dentro de un
Declaración SQL
-Describir las restricciones para llamar a funciones
desde sentencias SQL.

PLSQL 9-2
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 3
Usar funciones en sentencias SQL
Propósito
• En esta lección, aprenderá a utilizar funciones dentro de
sentencias SQL
• Si la instrucción SQL procesa muchas filas en una tabla, la
función se ejecuta una vez por cada fila procesada por la
instrucción SQL.
• Por ejemplo, puede calcular el impuesto que debe pagar
cada empleado utilizando una sola función.

PLSQL 9-2
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 4
Usar funciones en sentencias SQL
¿Qué es una función definida por el usuario?
• Una función definida por el usuario es una función creada por el
programador PL / SQL
• GET_DEPT_NAME y CALCULATE_TAX son ejemplos de funciones
definidas por el usuario, mientras que UPPER, LOWER y LPAD
son ejemplos de funciones definidas por el sistema
proporcionadas automáticamente por Oracle
• La mayoría de las funciones del sistema, como UPPER,
LOWER y LPAD se almacenan en un paquete denominado
SYS.STANDARD
• Los paquetes se tratan en una sección posterior.
• Estas funciones del sistema a menudo se denominan
funciones integradas.

PLSQL 9-2
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 5
Usar funciones en sentencias SQL
Ventajas de las funciones en sentencias SQL
• Si se usa en la cláusula WHERE de una instrucción SELECT,
las funciones pueden aumentar la eficiencia asegurando
que se devuelvan todas las filas deseadas
• Por ejemplo, en una gran base de datos de empleados,
podría tener más de un empleado con el mismo apellido
• Si usa el siguiente código, encontrará un empleado con el
apellido "Taylor", pero no el empleado cuyo apellido fue
ingresado como "taylor"

SELECT * FROM employees


WHERE last_name = 'Taylor';

PLSQL 9-2
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 6
Usar funciones en sentencias SQL
Ventajas de las funciones en sentencias SQL
• ¿De cuántas formas diferentes tendría que buscar para
encontrar todos los ejemplos posibles de "Taylor"?
• Al agregar la función UPPER a la cláusula WHERE, puede
encontrar todos los ejemplos con una búsqueda
SELECT * FROM employees
WHERE UPPER(last_name) = UPPER('TAylor');

• Este código devolverá a los empleados cuyo apellido se


almacenó como "Taylor", "TAYLOR", "taylor" o
"TAylor"
• Asimismo, no importa cómo el usuario ingrese el
criterio de búsqueda, ya que en este caso, se ingresó
en minúsculas ("TAylor")

PLSQL 9-2
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 7
Usar funciones en sentencias SQL
Ventajas de las funciones en sentencias SQL
• Las funciones en sentencias SQL también pueden manipular
valores de datos.
• Por ejemplo, para un evento social de fin de año, desea
(solo por diversión) para imprimir etiquetas de nombre
para cada empleado con los caracteres invertidos, por
lo que "Mary Jones" se convierte en "senoJ yraM"
• Puede crear una función definida por el usuario
llamada reverse_name, que hace esto, luego codifica:

SELECT reverse_name(last_name, first_name) FROM employees;

PLSQL 9-2
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 8
Usar funciones en sentencias SQL
Ventajas de las funciones en sentencias SQL
•Las funciones definidas por el usuario pueden extender SQL
donde las actividades son demasiado complejos, demasiado
incómodos o no están disponibles con SQL normal

• Las funciones también pueden ayudarnos a superar la


escritura repetida del mismo código.
• Por ejemplo, desea calcular cuánto tiempo ha estado
trabajando un empleado para su empresa,
redondeado a un número entero de meses.

PLSQL 9-2
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 9
Usar funciones en sentencias SQL
Ventajas de las funciones en sentencias SQL
• Puede crear una función definida por el usuario llamada
how_many_months para hacer esto

• Luego, el programador de la aplicación puede codificar:


SELECT employee_id, how_many_months(hire_date)
FROM employees;

PLSQL 9-2
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 10
Usar funciones en sentencias SQL
Función en expresiones SQL: ejemplo
• Cree una función para determinar los impuestos de cada empleado
CREATE OR REPLACE FUNCTION tax(p_value IN NUMBER)
RETURN NUMBER IS
BEGIN
RETURN (p_value * 0.08);
END tax;

SELECT employee_id, last_name, salary, tax(salary)


FROM employees
WHERE department_id = 50;
ID DE EMPLEADO APELLIDO SALARIO
IMPUESTO (SALARIO)
124 Mourgos 5800 464
141 Rajs 3500 280
142 Davies 3100 248
143 Matos 2600 208
144 Vargas 2500 200

11
PLSQL 9-2
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos.
Usar funciones en sentencias SQL
¿Dónde puede utilizar funciones definidas por el usuario en una
instrucción SQL?

• Las funciones definidas por el usuario actúan como funciones


integradas de una sola fila, como UPPER, LOWER y LPAD

• Se pueden utilizar en:


-La lista de columnas SELECT de una consulta
-Expresiones condicionales en las cláusulas WHERE y HAVING
-Las cláusulas ORDER BY y GROUP BY de una consulta
-La cláusula VALUES de la instrucción INSERT
-La cláusula SET de la declaración UPDATE
-En resumen, se pueden usar en cualquier lugar donde tenga un
valor o expresión

PLSQL 9-2
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 12
Usar funciones en sentencias SQL
¿Dónde puede utilizar funciones definidas por el usuario en una
instrucción SQL?

• Este ejemplo muestra el impuesto de función definida por el usuario que


se utiliza en cuatro lugares dentro de una sola declaración SQL
SELECT employee_id, tax(salary)
FROM employees
WHERE tax(salary) > (SELECT MAX(tax(salary))
FROM employees
WHERE department_id = 20)
ORDER BY tax(salary) DESC;

• La función hace que este código sea más fácil de leer y mucho más fácil
de actualizar si cambia la tasa de impuestos.

PLSQL 9-2
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 13
Usar funciones en sentencias SQL
Restricciones sobre el uso de funciones en sentencias SQL

• Para usar una función definida por el usuario dentro de una


declaración SQL, la función debe cumplir con las reglas y
restricciones del lenguaje SQL.

• La función solo puede aceptar tipos de datos SQL válidos como IN


parámetros, y debe DEVOLVER un tipo de datos SQL válido
• No se permiten tipos específicos de PL / SQL, como
BOOLEAN y% ROWTYPE
• No se deben exceder los límites de tamaño de SQL (PL / SQL
permite que una variable VARCHAR2 tenga un tamaño de hasta
32 KB, pero antes de Oracle 12c, SQL solo permitía 4 KB)

PLSQL 9-2
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 14
Usar funciones en sentencias SQL
Restricciones sobre el uso de funciones en sentencias SQL

• Las funciones definidas por el usuario pueden usar notación


posicional, con nombre y mixta para identificar argumentos
• Los parámetros para las funciones del sistema deben
especificarse con notación posicional
• Ejemplo:
SELECT employee_id, tax(p_value => salary)
FROM employees;

SELECT employee_id, UPPER(last_name)


FROM employees;

SELECT employee_id, UPPER(arg1 => last_name)


FROM employees;

• La tercera instrucción SELECT provoca un error

PLSQL 9-2
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 15
Usar funciones en sentencias SQL
Restricciones sobre el uso de funciones en sentencias SQL

• Las funciones llamadas desde una instrucción SELECT no pueden


contener instrucciones DML

• Funciones llamadas desde una instrucción UPDATE o DELETE


en una tabla no puede consultar o contener DML en la misma
tabla
• Las funciones llamadas desde cualquier instrucción SQL no pueden
finalizar transacciones (es decir, no pueden ejecutar operaciones
COMMIT o ROLLBACK)

PLSQL 9-2
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos.
Usar funciones en sentencias SQL
dieciséis
Restricciones sobre el uso de funciones en sentencias SQL

• Las funciones llamadas desde cualquier declaración SQL no


pueden emitir DDL (por ejemplo, CREATE TABLE) o DCL (por
ejemplo, ALTER SESSION) porque también hacen un COMMIT
implícito
• Las llamadas a subprogramas que rompen estas restricciones
tampoco están permitidas en una función.

PLSQL 9-2
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 17
Usar funciones en sentencias SQL
Restricciones sobre el uso de funciones en sentencias SQL:
Ejemplo 1
CREATE OR REPLACE FUNCTION dml_call_sql(p_sal NUMBER)
RETURN NUMBER IS
BEGIN
INSERT INTO employees(employee_id, last_name, email,
hire_date, job_id, salary)
VALUES(1, 'Frost', 'jfrost@company.com', SYSDATE, 'SA_MAN', p_sal);
RETURN (p_sal + 100);
END dml_call_sql;

UPDATE employees
SET salary = dml_call_sql(2000)
WHERE employee_id = 174;

18

PLSQL 9-2
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos.
Usar funciones en sentencias SQL
Restricciones sobre el uso de funciones en sentencias SQL:
Ejemplo 2

• La siguiente función consulta la tabla EMPLOYEES


CREATE OR REPLACE FUNCTION query_max_sal (p_dept_id NUMBER)
RETURN NUMBER IS
v_num NUMBER;
BEGIN
SELECT MAX(salary) INTO v_num FROM employees
WHERE department_id = p_dept_id;
RETURN (v_num);
END;

• Cuando se utiliza dentro de la siguiente declaración DML,


devuelve el mensaje de error "tabla mutante" similar al
mensaje de error que se muestra en la diapositiva anterior.
UPDATE employees
SET salary = query_max_sal(department_id)
WHERE employee_id = 174;

PLSQL 9-2
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 19
Usar funciones en sentencias SQL
Terminología
Los términos clave utilizados en esta lección incluyen:

-Función definida por el usuario

PLSQL 9-2
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 20
Usar funciones en sentencias SQL
Resumen
En esta lección, debería haber aprendido a:
-Enumere las ventajas de las funciones definidas por el
usuario en sentencias SQL

-Lista desde dónde se pueden llamar las funciones definidas por el


usuario dentro de un
Declaración SQL
-Describir las restricciones para llamar a funciones desde
sentencias SQL.

PLSQL 9-2
Copyright © 2020, Oracle y / o sus afiliados. Reservados todos los derechos. 21
Usar funciones en sentencias SQL

También podría gustarte