Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Ref. : 65073678.doc
Pgina 1 de 15
1. Organizacin del cdigo...............................................................................................3 1.1 Nomenclatura................................................................................................................3 1.1.1 Generalidades.............................................................................................................3 1.1.2 Objetos de cdigo.......................................................................................................3 1.1.3 Elementos de programacin.......................................................................................5 1.1.4 Comentarios...............................................................................................................8 1.1.5 Reglas de codificacin................................................................................................9
Ref. : 65073678.doc
Pgina 2 de 15
<APLICACION>_<TIPO_DE_OBJETO>_<DESCRIPCION>
Supongamos que desarrollamos la aplicacin de Gestin de Aumentos Salariales, a la que asignamos el acrnimo GAS. Los mtodos de nomenclatura seran
GAS_
PK PR FN SQ T
_<DESCRIPCION>
Los procedimientos almacenados seguirn la nomenclatura anterior. La descripcin de los procedimientos deber contener INS, UPD, DEL, SEL como prefijo si el procedimiento es de insercin de datos, actualizacin, borrado o recuperacin, seguido del nombre descriptivo de la tabla principal sobre la que se realiza la accin. En cualquier otro caso utilizaremos un nombre significativo de su funcin. Ejemplo:
GAS_PR_SEL_EMPLEADOS, ser un procedimiento de la aplicacin GAS que recupera la informacin de la tabla GAS_T_EMPLEADOS.
1.1.2.2 Funciones
Se aplican las mismas reglas que en el caso de procedimientos pero utilizando el identificador de funcin FN.
Ref. : 65073678.doc
Pgina 3 de 15
1.1.2.3 Packages
El package siempre debe ser una entidad que engloba objetos de programacin de base de datos relacionados funcionalmente entre s. Es recomendable crear un Package para gestionar todo el mantenimiento de una tabla que se compondr tpicamente de 4 procedimientos. Insercin, Borrado, Actualizacin y Seleccin. Por ejemplo podramos crear el paquete GAS_PK_MTO_EMPLEADOS que contendr los procedimientos
CREATE OR REPLACE PACKAGE GAS_PK_MTO_EMPLEADOS IS PROCEDURE PROCEDURE PROCEDURE PROCEDURE PR_INS_EMPLEADOS PR_UPD_EMPLEADOS PR_DEL_EMPLEADOS PR_SEL_EMPLEADOS (); (); (); ();
END GAS_MTO_EMPLEADOS;
En este caso hemos omitido de los procedimientos del package el prefijo de la aplicacin, GAS. Dentro de un package tambin se admite declarar los procedimientos sin hacer referencia a la tabla de mantenimiento:
CREATE OR REPLACE PACKAGE GAS_PK_MTO_EMPLEADOS IS PROCEDURE PROCEDURE PROCEDURE PROCEDURE PR_INS PR_UPD PR_DEL PR_SEL (); (); (); ();
END GAS_MTO_EMPLEADOS;
GAS_PK_MTO_EMPLEADOS.PR_INS ();
Ref. : 65073678.doc
Pgina 4 de 15
y queda igualmente claro que se trata del procedimiento de insercin sobre la tabla GAS_T_EMPLEADOS de la aplicacin GAS.
Las variables vendrn precedidas por el prefijo v_ ms un identificador significativo de la funcin que realiza. En el caso de que la variable almacene directamente el valor de un campo de la base de datos la denominacin de la variable ser v_<nombre del campo> . Ejemplo:
1.1.3.2 Constantes
Las constantes vendrn precedidas por el prefijo c_. Como en el caso de las variables cuando la constante est asociada directamente a un campo de tabla se identificar como c_<nombre del campo>. Ejemplo
1.1.3.3 Parmetros
Los parmetros en la llamada de un procedure o funcin vendrn precedidos por el prefijo p_. Como en el caso de las variables cuando el parametro est asociada directamente a un campo de tabla se identificar como p_<nombre del campo>. Ejemplo:
PROCEDURE
PR_DEL_EMPLEADOS
(p_COD_EMPLEADO
IN
Ref. : 65073678.doc
Pgina 5 de 15
....
1.1.3.4 Cursores
El identificador de cursores vendr precedido por el prefijo cur_ ms un nombre aclaratorio de su funcin. Si el cursor recupera datos directamente de una tabla es recomendable escribir cur_<nombre aclaratorio de la tabla>. Ejemplo:
CURSOR cur_EMPLEADOS IS SELECT COD_EMPLEADO , SALARIO FROM GAS_T_EMPLEADOS ORDER BY SALARIO DESC ;
Si utilizamos el cursor para modificar la tabla GAS_T_EMPLEADOS podemos escribir
CURSOR cur_UPD_EMPLEADOS IS SELECT COD_EMPLEADO , SALARIO FROM GAS_T_EMPLEADOS ORDER BY SALARIO DESC FOR UPDATE ;
Siempre que las variables estn relacionadas con un campo de una tabla se utilizar la sentencia %TYPE. Ejemplo
Ref. : 65073678.doc
Pgina 6 de 15
Para las variables NUMBER siempre designaremos los dgitos significativos y la precisin:
Todas las variables declaradas en un procedimiento tienen que estar inicializadas en el momento de su declaracin. A las constantes se asignar su valor definitivo. En las variables actuaremos como sigue:
Variables VARCHAR2: Inicializaremos a cadena vaca :=; Variables NUMBER: Inicializaremos a 0 o a otro valor significativo. Variables DATE: Inicializaremos a una fecha significativa, utilizando SIEMPRE el conversor de formato: := TO_DATE(31129999,DDMMYYYY);.
Ejemplo:
Ref. : 65073678.doc
Pgina 7 de 15
Por regla general cada sentencia DML tiene que estar comentada. El comentario ser un prrafo breve y claro en el que se describa la accin realizada y el porqu de los filtros utilizados Ejemplo:
/* SELECCIONAMOS EL SALARIO DE TODOS LOS EMPLEADOS EXCEPTO LOS DEL DEPARTAMENTO 'FI075' QUE NO ESTAN GESTIONADOS POR LA APLICACIN GAS SI NO QUE SON RESPONSABILIDAD DIRECTA DE RR.HH. */ SELECT SALARY INTO v_SALARY FROM GAS_T_EMPLEADOS WHERE DEPNO <> 'FI075'
Ejemplo:
/ *-----------------------------------------------------------------NOMBRE: GAS_PR_UPD_EMPLEADOS DESCRIPCIN: ACTUALIZA LA TABLA DE EMPLEADOS Y LA TABLA DE SITUACION ACTUAL DEL EMPLEADO DE ACUERDO CON LA INFORMACIN INTRODUCIDA. LLAMADA: FECHA CREACION: 25-MAYO-2010 AUTOR : ACME
AUTOR --------
DESCRIPCION ---------------------------
--------------------------------------------------------------------*/
Ref. : 65073678.doc
Pgina 8 de 15
1.1.4.3 Correcciones
Las correcciones del cdigo fuente irn siempre inventariadas en la cabecera del procedimiento. Las lneas de cdigo errenas o sustituidas no se borrarn sin que se comentarn, con el correspondiente cdigo de correccin, seguidas de las lneas corregidas.
REVISIONES: CODIGO FECHA AUTOR DESCRIPCION --------- ---------- -------- --------------------------CG0302#1 23/03/2002 ACME SUSTITUIMOS EL CODIGO DE DPTO NO GESTIONADO POR LA APLICACIN FI075 (ERRNEO) POR F1075 --------------------------------------------------------------------*/ BEGIN . SELECT SALARY INTO v_SALARY FROM GAS_T_EMPLEADOS --CG0302#1 WHERE DEPNO <> 'FI075' WHERE DEPNO <> 'F1075' --CG0302#1 SUSTITUIMOS EL DPTO ERRONEO ;
CREATE OR REPLACE PROCEDURE GAS_PR_EJEMPLO IS ... vPASO BEGIN ... BEGIN vPASO = 'SELECT 1'; /* SELECCIONAMOS EL NOMCRE DESCRIPTIVO DEL DEPARTAMENTO DEL EMPLEADO */ SELECT N_COD_DEPARTAMENTO INTO v_N_COD_DEPARTAMENTO FROM GAS_T_DEPARTAMENTOS VARCHAR2(10) := ''; -- VARIABLE QUE IDENTIFICA LA SENTENCIA DML
Ref. : 65073678.doc
Pgina 9 de 15
WHERE COD_DEPARTAMENTO = v_COD_DEPARTAMENTO ; EXCEPTION WHEN NO_DATA_FOUND THEN ... WHEN TOO_MANY_ROWS THEN ... WHEN OTHERS ... END ; ... IF v_TIPO_DEPARTAMENTO = v_DEPRTO_ESPECIAL THEN BEGIN vPASO := 'INSERT 1'; /* INSERTAMOS ... */ INSERT INTO... ; EXCEPTION WHEN DUP_VAL_ON_INDEX THEN ... END ; ELSE -- NO ES UN DEPTO ESPECIAL BEGIN vPASO := 'DELETE 1'; /* BORRAMOS... */ DELETE FROM ... ; EXCEPTION WHEN OTHERS THEN .... END ; END IF; -- v_TIPO_DEPARTAMENTO = v_DEPRTO_ESPECIAL ... EXCEPTION ... END GAS_PR_EJEMPLO;
Ref. : 65073678.doc
Pgina 10 de 15
AND (outer joins de tablas) B.INDEX = C.INDEX (+) AND/OR (Filtro de datos) A.IDX = c_IDX
SELECT CAMPO1 ,CAMPO2 ,CAMPO3 ,... ,CAMPOn INTO v_CAMPO1 ,v_CAMPO2 ,v_CAMPO3 , ... , v_CAMPOn FROM TABLA1 ALIAS_TABLA_1 , TABLA2 ALIAS_TABLA_2 , ... , TABLA1 ALIAS_TABLA_m WHERE (inner joins de tablas) (outer joins de tablas) AND/OR (Filtro de datos) GROUP BY ORDER BY HAVING START WITH CONNECT BY UNION / INTERSECT / MINUS ; Observemos que recomendamos poner la coma de separacin de campos o variables antes del campo. De esta manera se disminuye el riesgo de error al aadir un nuevo campo en la sentencia. Por la misma razn el punto y coma ; final se coloca en una nueva lnea. La misma recomendacin se hace para la suma o resta de campos con el smbolo + --
La sentencia INSERT seguir la siguiente estructura: INSERT INTO <nombre de tabla> ( CAMPO1 ,CAMPO2 ,CAMPO3 ,... ,CAMPOn) VALUES (v_CAMPO1 ,v_CAMPO2
Ref. : 65073678.doc
Pgina 11 de 15
,... ,vCAMPOn) ;
Siempre que realicemos operaciones aritmticas en sentencias SELECT, bsicamente sumas, ya sea a nivel de fila o de columnas diferentes utilizaremos la funcin NVL para evitar resultados globales nulos debidos a campos particulares en nulo. Ejemplo
Ref. : 65073678.doc
Pgina 12 de 15
CURSOR cur_EMPLEADOS (p_COD_DEPARTAMENTO IN VARCHAR2) IS SELECT COD_EMPLEADO FROM GAS_T_EMPLEADOS WHERE COD_DEPARTAMENTO = p_COD_DEPARTAMENTO ORDER BY COD_EMPLEADO ; ...
Observemos que la sentencia LOOP se sita en una nueva lnea debajo de FOR. En la sentencia END LOOP se etiqueta con el nombre del cursor.
V_INDICADOR := 1; BEGIN SELECT 1 INTO v_INDICADOR FROM DUAL WHERE EXISTS ( SELECT COD_EMPLEADO FROM GAS_T_EMPLEADOS WHERE COD_EMPLEADO = 045A6 )
Ref. : 65073678.doc
Pgina 13 de 15
; EXCEPTION
END ;
Para la ejecucin de sentencias DML utilizaremos la utilidad DBMS_SQL siempre realizando el BIND de las variables. Con esto evitamos hacer el PARSE, que es el comando ms costoso en CPU. Ejemplo
dbms_sql.define_column(source_cursor, 1,v_SALARIO);
Ref. : 65073678.doc
Pgina 14 de 15
v_ROWS := DBMS_SQL.EXECUTE_AND_FETCH(source_cursor);
EXCEPTION WHEN OTHERS THEN ROLLBACK GAS_PR_ERRORES (v_PROCEDURE_NAME, v_SENTENCIA_ERROR, USER); RETURN END ;
SQLCODE,
SQLERRM,
Ref. : 65073678.doc
Pgina 15 de 15