0% encontró este documento útil (0 votos)
35 vistas19 páginas

Procs

El documento cubre varios temas relacionados con PL/SQL como bloques, excepciones, procedimientos almacenados, funciones, permisos y transacciones. Explica cómo crear y llamar a procedimientos y funciones, y cómo manejar excepciones y permisos.

Cargado por

Daniel del Río
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
35 vistas19 páginas

Procs

El documento cubre varios temas relacionados con PL/SQL como bloques, excepciones, procedimientos almacenados, funciones, permisos y transacciones. Explica cómo crear y llamar a procedimientos y funciones, y cómo manejar excepciones y permisos.

Cargado por

Daniel del Río
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

BLOQUES

MULTIBLOQUES
SET SERVEROUTPUT ON;

<<principal>>
DECLARE
x PLS_INTEGER := 5;
BEGIN
DECLARE
x PLS_INTEGER := 3;
y PLS_INTEGER;
BEGIN
y := x + principal.x;
DBMS_OUTPUT.PUT_LINE('El resultado es: ' || y);
END;
DBMS_OUTPUT.PUT_LINE('El valor de X es: ' || x);
END;
Excepciones
EXCEPTION
SET SERVEROUTPUT ON;

DECLARE ...

BEGIN ...

EXCEPTION
WHEN ... THEN
DECLARE
BEGIN
EXCEPTION
END;
END;
WHEN-THEN
….
EXCEPTION
WHEN ZERO_DIVIDE THEN
-- Tratemos de resolver el problema
DECLARE
BEGIN
EXCEPTION
END;
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('No hay resultados');
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('Recuerda que sólo se permite un resultado!!');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(‘Ni idea….' || SQLERRM);
END;
RAISE
SET SERVEROUTPUT ON;
DECLARE
PEDIDO_MUY_BAJO EXCEPTION;
cantidad PLS_INTEGER := 5;
precio DEC(7,2) := -14.99;

BEGIN
IF cantidad < 5 THEN
RAISE PEDIDO_MUY_BAJO;
END IF;
IF precio < 0 THEN
RAISE INVALID_NUMBER;
END IF;
END;
Stored Procedures
PROCEDURE
CREATE [OR REPLACE] PROCEDURE MI_PROCEDIMIENTO1
(X IN PLS_INTEGER, Y IN PLS_INTEGER, Z OUT PLS_INTEGER) AS

BEGIN
Z := X + Y;

END MI_PROCEDIMIENTO1;

CREATE [OR REPLACE] PROCEDURE MI_PROCEDIMIENTO2


(X IN OUT PLS_INTEGER, Y IN PLS_INTEGER DEFAULT 7) AS

BEGIN
X := X + Y;

END MI_PROCEDIMIENTO2;
CALL PROCEDURES
DECLARE
param1 PLS_INTEGER := 5;
param2 PLS_INTEGER := 3;
resultado PLS_INTEGER;

BEGIN
MI_PROCEDIMIENTO1(param1, param2, resultado);
DBMS_OUTPUT.PUT_LINE('El resultado es….' || resultado);

MI_PROCEDIMIENTO2(resultado); -- por defecto suma 7


DBMS_OUTPUT.PUT_LINE('El resultado es….' || resultado);

[EXCEPTION]

END;
TRANSACTIONS
CREATE [OR REPLACE] PROCEDURE MI_PROCEDIMIENTO3 (X IN PLS_INTEGER) AS
BEGIN
DELETE FROM USUARIOS WHERE ID > 5;
MI_PROCEDIMIENTO4;
ROLLBACK;
END MI_PROCEDIMIENTO3;

CREATE [OR REPLACE] PROCEDURE MI_PROCEDIMIENTO4 AS


PRAGMA AUTONOMOUS_TRANSACTION;

BEGIN
UPDATE USUARIOS SET NOMBRE = 'Oliver' WHERE ID = 15;
COMMIT;
END MI_PROCEDIMIENTO4;
Stored Functions
FUNCTION
CREATE [OR REPLACE]
FUNCTION MI_FUNCION (X PLS_INTEGER, Y PLS_INTEGER) RETURN PLS_INTEGER AS

DECLARE
Z PLS_INTEGER;

BEGIN
Z := X + Y;
RETURN Z;

END MI_FUNCION;
CALL FUNCTIONS
DECLARE
param1 PLS_INTEGER := 5;
param2 PLS_INTEGER := 3;
resultado PLS_INTEGER;

BEGIN
resultado := MI_FUNCION(param1, param2);
DBMS_OUTPUT.PUT_LINE('El resultado es….' || resultado);

resultado := MI_FUNCION(&entrada1, &entrada2); -- variables de sustitución


DBMS_OUTPUT.PUT_LINE('El resultado es….' || resultado);

[EXCEPTION]

END;
Permisos
GRANT
GRANT UPDATE ON HR.EMPLOYEES TO CURSO;

GRANT INSERT,DELETE ON HR.EMPLOYEES TO PUBLIC;

GRANT ALL ON HR.EMPLOYEES TO PUBLIC;

GRANT ALL ON HR.EMPLOYEES TO CURSO WITH GRANT OPTION;

GRANT EXECUTE ON MI_PROCEDIMIENTO TO CURSO;

GRANT EXECUTE ON MI_FUNCION TO PUBLIC;

GRANT CONNECT TO CURSO;

GRANT DBA TO NUEVO_USUARIO IDENTIFIED BY p@$$w0rd;


REVOKE
REVOKE UPDATE ON HR.EMPLOYEES FROM CURSO;

REVOKE INSERT,DELETE ON HR.EMPLOYEES FROM PUBLIC;

REVOKE ALL ON HR.EMPLOYEES FROM PUBLIC;

REVOKE ALL ON HR.EMPLOYEES FROM CURSO;

REVOKE EXECUTE ON MI_PROCEDIMIENTO FROM CURSO;

REVOKE EXECUTE ON MI_FUNCION FROM PUBLIC;

REVOKE CONNECT FROM CURSO;

REVOKE DBA FROM NUEVO_USUARIO;


ORACLE CURSO
1. Obtener mediante procedimiento
• Cuántos pedidos ha realizado Edward Logan
• Las fechas en formato dd-mm-yy
• El número de personas que han pedido los mismos artículos
• El total de ingresos por las ventas de dichos artículos (pedidos completos)

2. Crear un procedimiento que permita crear cuentas de usuario a


partir de clientes
3. Dividir el procedimiento anterior en funciones y procedimientos
con control de excepciones
• Buscar un cliente por apellido (error si hay más de uno)
• Convertir una fila DEMO_CUSTOMER en DEMO_USERS
• Solicitando el password por consola
• Sólo permitir clientes existentes

También podría gustarte