Вы находитесь на странице: 1из 33

*

Nomenclatura Mejores Prcticas

NOMENCLATURA DE TABLESPACE
TBSP_<[TBL][IDX]>_<NOMBRE_TABLESPACE> TBL: TABLA | IDX: INDICE
Ejemplo: CREATE TABLESPACE TBSP_TBL_SECURITY DATAFILE /TBSP_TBL_SECURITY.DBF' SIZE 500M EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M PERMANENT;

NOMENCLATURA DE TABLA
TBL_<NOMBRE_TABLA> Ejemplo:

CREATE TABLE TBL_GROUP (


GRP_GROUP_CODE NUMBER(18, 0) NOT NULL, GRP_GROUP_NAME VARCHAR2(50) NOT NULL )

TABLESPACE TBSP_SECURITY;

NOMENCLATURA DE CAMPO DE TABLA


<INICIALES_NOMBRE_TABLA>_<NOMBRE_CAMPO> INICIALES DE NOMBRE TABLA: 3 dgitos. Ejemplo: CREATE TABLE TBL_GROUP ( GRP_GROUP_CODE NUMBER(18, 0) NOT NULL, GRP_GROUP_NAME VARCHAR2(50) NOT NULL ) TABLESPACE TBSP_SECURITY;

NOMENCLATURA DE VISTA
VIEW_<NOMBRE_VISTA> Ejemplo: CREATE VIEW VIEW_USER AS SELECT USR_USER_FIRSTNAME, USR_USER_LASTNAME FROM TBL_USER WHERE USER_LOGIN = HBRAVO;

NOMENCLATURA DE INDICE
IDX_<NOMBRE_TABLA>_<NRO_CORRELATIVO> Ejemplo: CREATE INDEX IDX_USER_1 ON TBL_USER ( USER_LASTNAME, USER_FIRSTNAME ) TABLESPACE TBSP_IDX_SECURITY;

NOMENCLATURA DE PRIMARY KEY


PK_<NOMBRE_TABLA> Ejemplo:

ALTER TABLE TBL_USER ADD (


CONSTRAINT PK_USER PRIMARY KEY (USER_LOGIN) );

NOMENCLATURA DE FOREIGN KEY


FK_<NOMBRE_TABLA>_<NRO_CORRELATIVO> Ejemplo:

ALTER TABLE TBL_USER_GROUP ADD (


CONSTRAINT FK_USER_GROUP_1 FOREIGN KEY (USER_LOGIN) REFERENCES TBL_USER (USER_LOGIN) );

NOMENCLATURA DE PAQUETE
PKG_<NOMBRE_PAQUETE> Ejemplo: CREATE OR REPLACE PACKAGE PKG_SECURITY AS END PKG_SECURITY; CREATE OR REPLACE PACKAGE BODY PKG_SECURITY AS END PKG_SECURITY;

NOMENCLATURA DE TIPO
T_<NOMBRE_TIPO> Ejemplo:

TYPE T_CURSOR IS REF CURSOR;

NOMENCLATURA DE PROCEDURE
PRC_<[S][I][U][D]>_<NOMBRE_PROCEDURE> S: SELECT | I: INSERT | U: UPDATE | D: DELETE Ejemplo: SI ES MUCHOS REGISTROS CON PARAMETROS DE ENTRADA PROCEDURE PRC_S_USERS_FILTERS(); SI ES MUCHOS REGISTROS SIN PARAMETROS DE ENTRADA PROCEDURE PRC_S_USERS();

SI ES UN UNICO REGISTRO PROCEDURE PRC_S_USER();

NOMENCLATURA DE FUNCION
FNT_<NOMBRE_FUNCION> Ejemplo:

FUNCTION FNT_CALCULATE_AGE()
RETURN NUMBER;

NOMENCLATURA DE PARAMETRO
P_<NOMBRE_CAMPO_TABLA> P_<NOMBRE_PARAMETRO_AUXILIAR> P_<NOMBRE_CURSOR> Ejemplo: PROCEDURE PRC_S_PARAMETER ( P_PARAMETER_CODE IN TBL_PARAMETER.PARAMETER_CODE%TYPE, P_CODAUX IN NUMBER, P_CURSOR OUT T_CURSOR );

NOMENCLATURA DE VARIABLE
V_<NOMBRE_CAMPO_TABLA> V_<NOMBRE_VARIABLE_AUXILIAR> Ejemplo: PROCEDURE PRC_S_PARAMETER () AS V_PARAMETER_CODE TBL_PARAMETER.PARAMETER_CODE%TYPE; V_CODAUX NUMBER(3, 0); BEGIN END PRC_S_PARAMETER;

NOMENCLATURA DE SEQUENCE
SEQ_<NOMBRE_TABLA> Ejemplo:

CREATE SEQUENCE SEQ_USER


MIN VALUE 1 START WITH 1 INCREMENT BY 1

NOCACHE;

NOMENCLATURA DE TRIGGER
TRG_<[B][A]>_<[I] OR [U] OR [D]><NOMBRE_TABLA> B: BEFORE | A: AFTER I: INSERT | U: UPDATE | D: DELETE NOTA: EL TRIGGER NO ES RECOMENDABLE USARLO, SALVO CASOS ESPECIALES QUE SE REQUIERA. Ejemplo: CREATE OR REPLACE TRIGGER TRG_A_IU_USER AFTER INSERT OR UPDATE ON TBL_USER FOR EACH ROW DECLARE BEGIN END TRG_A_IU_USER;

ALTERNATIVA PARA EVITAR QUERY DINAMICO USANDO AND Y OR


PROCEDURE PRC_EMPLOYEES ( P_EMPLOYEE_NAME VARCHAR2(100), P_DEPARTMENT VARCHAR2(50), P_DESIGNATION VARCHAR2(50), P_START_DATE DATE, P_END_DATE DATE, P_SALARY NUMBER(10, 2) ) AS BEGIN OPEN P_CURSOR FOR SELECT EMPLOYEE_NAME, DEPARTMENT, DESIGNATION, JOINING_DATE, SALARY FROM TBL_EMPLOYEE WHERE (P_EMPLOYEE_NAME IS NULL OR EMPLOYEE_NAME = P_EMPLOYEE_NAME) AND (P_DEPARTMENT IS NULL OR DEPARTMENT = P_DEPARTMENT) AND (P_DESIGNATION IS NULL OR DESIGNATION = P_DESIGNATION) AND (P_SALARY IS NULL OR SALARY >= P_SALARY) AND (P_START_DATE IS NULL OR P_END_DATE IS NULL OR (P_START_DATE IS NOT NULL AND P_END_DATE IS NOT NULL AND JOINING_DATE BETWEEN P_START_DATE AND P_END_DATE)); END PRC_EMPLOYEES;

USAR EN LO MAYOR POSIBLE SQL ESTANDAR


EVITAR: WHERE PAR.APPLICATION_CODE = APP.APPLICATION_CODE AND PAR.TABLE_CODE(+) = RTA.TABLE_CODE USAR: SELECT PAR.PARAMETER_NAME, APP.APPLICATION_NAME, RTD.ARGUMENT_VALUE_SECOND, RTA.TABLE_DESCRIPTION FROM TBL_PARAMETER PAR INNER JOIN TBL_APPLICATION APP ON ( PAR.APPLICATION_CODE = APP.APPLICATION_CODE ) INNER JOIN TBL_REFERENCE_TABLE_DETAIL RTD ON ( PAR.PARAMETER_TYPE_CODE = RTD.REFERENCE_CODE ) LEFT JOIN TBL_REFERENCE_TABLE RTA ON ( PAR.TABLE_CODE = RTA.TABLE_CODE );

FORMATEO DE SELECT
SELECT PAR.PARAMETER_NAME, APP .APPLICATION_NAME FROM TBL_PARAMETER PAR INNER JOIN TBL_APPLICATION APP ON ( PAR.APPLICATION_CODE = APP.APPLICATION_CODE

)
WHERE PAR.PARAMETER_CODE = 1 AND APP .APPLICATION_CODE = 1

FORMATEO DE INSERT
INSERT INTO TBL_PARAMETER ( PARAMETER_CODE,

PARAMETER_NAME
) VALUES ( P_PARAMERTER_CODE,

P_PARAMETER_NAME
);

FORMATEO DE UPDATE
UPDATE TBL_PARAMETER SET PARAMETER_CODE = P_PARAMETER_NAME,

PARAMETER_NAME = P_PARAMETER_VALUE
WHERE PARAMETER_CODE = P_PARAMETER_CODE;

FORMATEO DE DELETE
DELETE FROM TBL_PARAMETER WHERE PARAMERTER_CODE = P_PARAMERTER_CODE;

FORMATEO DE PROCEDURES
PROCEDURE PRC_S_PARAMETERS ( <PARAMETROS DEL PROCEDURE - OPCIONAL> ) AS <VARIABLES DEL PROCEDURE - OPCIONAL> BEGIN <CUERPO DEL PROCEDURE: SOLO VA SETENCIAS SIMPLES COMO SELECT, INSERT, UPDATE Y DELETE, NO LOGICA DE NEGOCIO> END PRC_S_PARAMETERS;

FORMATEO DE FUNCIONES
FUNCTION FNT_CALCULATE_AGE ( <PARAMETROS DEL FUNCTION - OPCIONAL> ) RETURN <TIPO DE DATO DE RETORNO> AS <VARIABLES DEL FUNCTION - OPCIONAL> BEGIN <CUERPO DEL FUNCTION: LOGICA UTILITARIA> RETURN <VARIABLE A RETORNAR>; END FNT_CALC_AGE;

FORMATEO DE PACKAGE
CREATE OR REPLACE PACKAGE PKG_SECURITY AS <VARIABLES DEL PACKAGE (CURSOR Y CONSTANTES) - OPCIONAL> <DEFINICION DE FUNCIONES O PROCEDURES> END PKG_SECURITY; CREATE OR REPLACE PACKAGE BODY PKG_SECURITY AS <IMPLEMENTACION DE FUNCIONES O PROCEDURES> END PKG_SECURITY;

DOCUMENTACION DE PACKAGE
Evitar el uso de tildes en la documentacin.
/** * Descripcion breve. * @author hbravo * @version 1.0 hbravo 20/02/2009.<br/>1.1 cgavidia 30/11/2009 */

DOC. PROCEDURE Y FUNCTION EN PACKAGE


Evitar el uso de tildes en la documentacin.
/* * Descripcion breve. * @param PARAMETRO1 Comentario sobre el parametro. * @param PARAMETRO2 Comentario sobre el parametro. * @return VARCHAR2 Comentario sobre el valor de retorno<Usar solo para funciones>. * @author hbravo * @version 1.0 hbravo 20/02/2009.<br/>1.1 cgavidia 30/11/2009 */

DOC. PROCEDURE Y FUNCTION EN PACKAGE


Nota: Esto es generado con el comando PLDOC.

Ejemplo:
/* * Obtiene un listado de usuarios. * @param P_USER_FIRSTNAME Nombre del usuario. * @return INTEGER Ultimo codigo de usuario<Solo en caso de funcion agregarlo>. * @author hbravo * @version 1.0 hbravo 31/12/2011.<br/>1.1 cgavidia 05/01/2012 */ PROCEDURE PRC_S_USERS (.

DOC. PROCEDURE Y FUNCTION EN PACKAGE


Con Maven: <dependency>

<groupId>net.sourceforge.pldoc</groupId>
<artifactId>maven-pldoc-plugin</artifactId> <version>2.0</version> </dependency>
Comandos:

$ pldoc -d <carpetaSalida> -doctitle <TituloDoc> overview overview.html script*.sql

TIPS DE MEJORES PRACTICAS


(SELECT * FROM).

* Evitar usar artersco en seleccin de campos * Evitar alias como A, B, C, etc. Los alias debe ser 3 caracteres
que indentifiquen la tabla.

* Evitar usar funciones en la clausula where ya que rompe los


ndices, aunque Oracle puede crear ndices con funciones pero otros motores de BD no lo soportan:
WHERE UPPER(USR_USER_FIRSTNAME) = UPPER(P_USER_FIRSTNAME);

* Evitar usar clculos en la clausula where ya que rompe los


ndices: WHERE SALARY * 5 > P_SALARY;

TIPS DE MEJORES PRACTICAS


* *
Evitar palabras reservadas en los nombres de objetos de Base de Datos. Colocar ndices solo a las tablas que almacenarn un gran volumen de registros y que son consultadas frecuentemente.

Los parmetros que estn relacionados con campos de tablas deben usar %TYPE con su tabla maestra:
P_PARAMETER_CODE IN TBL_PARAMETER.PARAMETER_CODE%TYPE

Evitar usar en lo mayor posible la clausula LIKE solo en casos necesarios usarlo, debera usar igualdad.

*
*

Al crear las tablas de base de datos los tipos numricos deben ser NUMBER, y los tipos fecha DATE y TIMESTAMP segn lo requiera.
La longitud mxima de los objetos de Base de Datos debe ser de 30 caracteres.

TIPS DE MEJORES PRACTICAS


*
Evitar usar las clausulas IN, NOT IN, EXISTS, NOT EXISTS en las clausulas WHERE; ya que disminuyen rendimiento, estos pueden ser reemplazados usando las clausulas JOIN. Solo usar IN y NOT IN con valores constantes y no con subquerys. Por ejemplo: SELECT USR.USR_USER_FIRSTNAME // SENTENCIA INCORRECTA FROM TBL_USER USR WHERE EXISTS ( SELECT * FROM TBL_LOG LOG WHERE USR.USR_USER_CODE = LOG.LOG_USER_CODE ) SELECT USR.USR_USER_FIRSTNAME // SETENCIA CORRECTA FROM TBL_USER USR INNER JOIN TBL_LOG LOG ON ( USR.USR_USER_CODE = LOG.LOG_USER_CODE );

REFERENCIAS Y BIBLIOGRAFIA
* * * * * *
http://stackoverflow.com/questions/227037/can-i-get-better-performanceusing-a-join-or-using-exists http://social.msdn.microsoft.com/Forums/es/sqlserveres/thread/779a9496b99a-472d-837d-099215 http://www.dba-oracle.com/oracle_news/2004_3_8.htm http://www.dba-oracle.com/s_sql_best%20practices.htm http://www.um.es/atica/como-documentar-el-codigo-pl-sql http://mvnrepository.com/artifact/net.sourceforge.pldoc/maven-pldocplugin/2.0

http://pldoc.sourceforge.net/maven-site/

Вам также может понравиться