|
| 1 | +--Bloque anonimo |
| 2 | + |
| 3 | +DECLARE |
| 4 | + v_store_name stores.store_name%TYPE:='London'; |
| 5 | + n_year int:=2018; |
| 6 | + n_order_count int; |
| 7 | +BEGIN |
| 8 | + select count(*) |
| 9 | + into n_order_count |
| 10 | + from orders o |
| 11 | + inner join stores s |
| 12 | + on o.store_id = s.store_id |
| 13 | + where extract(year from o.order_datetime)=n_year |
| 14 | + and s.tore_name=v_store_name |
| 15 | + group by s.store_name, extract(year from o.order_datetime); |
| 16 | + dbms_output.put_line('Total de ordenes para '|| v_store_name||' en' ||n_year||':'||n_order_count); |
| 17 | + |
| 18 | +END; |
| 19 | + |
| 20 | +--Funciones |
| 21 | +--IN se comporta como constante |
| 22 | +--OUT parametros que no proveen valor pero son asignados y retornados |
| 23 | +--IN OUT proveen valor y son asignados y retornados io |
| 24 | +CREATE OR REPLACE FUNCTION obtener_conteo_ordenes_por_tienda_y_anio( |
| 25 | +i_store_name IN stores.store_name%TYPE, |
| 26 | +i_year IN INT |
| 27 | +) |
| 28 | +RETURN int IS |
| 29 | +n_order_count int; |
| 30 | +BEGIN |
| 31 | + select count(*) |
| 32 | + into n_order_count |
| 33 | + from orders o |
| 34 | + inner join stores s |
| 35 | + on o.store_id = s.store_id |
| 36 | + where extract(year from o.order_datetime)=i_year |
| 37 | + and s.tore_name=i_store_name |
| 38 | + group by s.store_name, extract(year from o.order_datetime); |
| 39 | + RETURN(n_order_count); |
| 40 | +end; |
| 41 | + |
| 42 | +select obtener_conteo_ordenes_por_tienda_y_anio('Berlin',2018) from dual; |
| 43 | +DROP FUNCTION obtener_conteo_ordenes_por_tienda_y_anio; |
| 44 | + |
| 45 | +--Procedimientos (son bloques anonimos almacenados), ejecutan acciones no retornan nada |
| 46 | +--Ejemplo 1: |
| 47 | +CREATE OR REPLACE PROCEDURE insertar_tienda( |
| 48 | +i_nombre IN stores.store_name%TYPE DEFAULT' Desconocido', |
| 49 | +i_loc IN stores.physical_address%TYPE DEFAULT 'Desconocido' |
| 50 | +) |
| 51 | +IS |
| 52 | +BEGIN |
| 53 | + INSERT INTO STORES(STORE_NAME,PHYSICAL_ADDRESS) |
| 54 | + VALUES(i_nombre,i_loc); |
| 55 | +end insertar_tienda; |
| 56 | + |
| 57 | +BEGIN |
| 58 | + insertar_tienda(); |
| 59 | + insertar_tienda('Training','New york'); |
| 60 | + insertar_tienda(i_loc => 'BOSTON'); |
| 61 | +END; |
| 62 | +DROP PROCEDURE insertar_tienda; |
| 63 | + |
| 64 | +--Ejemplo 2: |
| 65 | + |
| 66 | +CREATE OR REPLACE PROCEDURE ajuste_salarial( |
| 67 | +i_id IN EMPLOYEES.employee_id%TYPE, |
| 68 | +i_porcentaje IN FLOAT |
| 69 | +) |
| 70 | +IS |
| 71 | +BEGIN |
| 72 | + UPDATE EMPLOYEES |
| 73 | + SET SALARY = SALARY + (1+i_porcentaje) |
| 74 | + WHERE EMPLOYEE_ID=i_id; |
| 75 | +end ajuste_salarial; |
| 76 | +BEGIN |
| 77 | + ajuste_salarial(100,0.1); |
| 78 | +END; |
| 79 | + |
| 80 | +--Ejemplo 3: |
| 81 | + |
| 82 | +CREATE OR REPLACE PROCEDURE obtener_datos_empleado( |
| 83 | +i_id IN EMPLOYEES.employee_id%TYPE, |
| 84 | +o_first_name OUT EMPLOYEES.first_name%TYPE, |
| 85 | +o_last_name OUT EMPLOYEES.last_name%TYPE, |
| 86 | +) |
| 87 | +IS |
| 88 | +BEGIN |
| 89 | + SELECT FIRST_NAME, LAST_NAME |
| 90 | + INTO o_first_name,o_last_name |
| 91 | + FROM EMPLOYEES |
| 92 | + WHERE EMPLOYEE_ID=i_id |
| 93 | +end obtener_datos_empleado; |
| 94 | + |
| 95 | +BEGIN |
| 96 | + obtener_datos_empleado(100); |
| 97 | +END; |
| 98 | + |
| 99 | + |
| 100 | +--Paquetes (agrupar objetos almacenados en la BD) |
| 101 | +--cabecera y cuerpo |
| 102 | +--declare: variable,cursores, excepciones, funciones procedimientos |
| 103 | +DROP PROCEDURE ajuste_salarial; |
| 104 | +DROP PROCEDURE obtener_datos_empleado; |
| 105 | + |
| 106 | +CREATE OR REPLACE PACKAGE hr_procedures IS |
| 107 | + |
| 108 | + PROCEDURE ajuste_salarial( |
| 109 | + i_id IN EMPLOYEES.employee_id%TYPE, |
| 110 | + i_porcentaje IN FLOAT); |
| 111 | + |
| 112 | + PROCEDURE obtener_datos_empleado( |
| 113 | + i_id IN EMPLOYEES.employee_id%TYPE, |
| 114 | + o_first_name OUT EMPLOYEES.first_name%TYPE, |
| 115 | + o_last_name OUT EMPLOYEES.last_name%TYPE, |
| 116 | + ); |
| 117 | + |
| 118 | +END hr_procedures; |
| 119 | + |
| 120 | +CREATE OR REPLACE PACKAGE BODY hr_procedures IS |
| 121 | + |
| 122 | + PROCEDURE ajuste_salarial( |
| 123 | + i_id IN EMPLOYEES.employee_id%TYPE, |
| 124 | + i_porcentaje IN FLOAT |
| 125 | + ) IS |
| 126 | + BEGIN |
| 127 | + UPDATE EMPLOYEES |
| 128 | + SET SALARY = SALARY + (1+i_porcentaje) |
| 129 | + WHERE EMPLOYEE_ID=i_id; |
| 130 | + end ajuste_salarial; |
| 131 | + |
| 132 | + PROCEDURE obtener_datos_empleado( |
| 133 | + i_id IN EMPLOYEES.employee_id%TYPE, |
| 134 | + o_first_name OUT EMPLOYEES.first_name%TYPE, |
| 135 | + o_last_name OUT EMPLOYEES.last_name%TYPE, |
| 136 | + ) IS |
| 137 | + BEGIN |
| 138 | + SELECT FIRST_NAME, LAST_NAME |
| 139 | + INTO o_first_name,o_last_name |
| 140 | + FROM EMPLOYEES |
| 141 | + WHERE EMPLOYEE_ID=i_id |
| 142 | + end obtener_datos_empleado; |
| 143 | +END hr_procedures; |
| 144 | + |
| 145 | +DECLARE |
| 146 | +BEGIN |
| 147 | + hr_procedures.ajuste_salarial(100); |
| 148 | + hr_procedures.obtener_datos_empleado(100); |
| 149 | +END; |
| 150 | + |
| 151 | +DROP PACKAGE ; |
| 152 | +DROP PACKAGE BODY; |
| 153 | + |
| 154 | + |
| 155 | + |
| 156 | + |
| 157 | + |
| 158 | + |
| 159 | + |
| 160 | + |
| 161 | + |
| 162 | + |
| 163 | + |
| 164 | + |
| 165 | + |
| 166 | + |
| 167 | + |
| 168 | + |
| 169 | + |
| 170 | + |
| 171 | + |
0 commit comments