Está en la página 1de 33

* Estándares de Base

de Datos Oracle

Nomenclatura
Mejores Prácticas
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
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
NOMENCLATURA DE CAMPO DE TABLA
<INICIALES_NOMBRE_TABLA>_<NOMBRE_CAMPO>
INICIALES DE NOMBRE TABLA: 3 dígitos.
Ejemplo:
CREATE TABLE TBL_GROUP (
GRP_GROUP_CODE NUMBER(18, 0) NOT NULL,
GRP_GROUP_NAME VARCHAR2(50) NOT NULL
)
TABLESPACE TBSP_SECURITY;

*Nomenclatura
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
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
NOMENCLATURA DE PRIMARY KEY
PK_<NOMBRE_TABLA>
Ejemplo:
ALTER TABLE TBL_USER ADD (
CONSTRAINT PK_USER PRIMARY KEY (USER_LOGIN)
);

*Nomenclatura
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
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
NOMENCLATURA DE TIPO
T_<NOMBRE_TIPO>
Ejemplo:
TYPE T_CURSOR IS REF CURSOR;

*Nomenclatura
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
NOMENCLATURA DE FUNCION
FNT_<NOMBRE_FUNCION>
Ejemplo:
FUNCTION FNT_CALCULATE_AGE()
RETURN NUMBER;

*Nomenclatura
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
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
NOMENCLATURA DE SEQUENCE
SEQ_<NOMBRE_TABLA>
Ejemplo:
CREATE SEQUENCE SEQ_USER
MIN VALUE 1
START WITH 1
INCREMENT BY 1
NOCACHE;

*Nomenclatura
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;

*Nomenclatura
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;

*Mejores Prácticas
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
);

*Mejores Prácticas
 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

*Mejores Prácticas
 FORMATEO DE INSERT
INSERT INTO TBL_PARAMETER (
PARAMETER_CODE,
PARAMETER_NAME
)
VALUES (
P_PARAMERTER_CODE,
P_PARAMETER_NAME
);

*Mejores Prácticas
 FORMATEO DE UPDATE
UPDATE TBL_PARAMETER
SET PARAMETER_CODE = P_PARAMETER_NAME,
PARAMETER_NAME = P_PARAMETER_VALUE
WHERE PARAMETER_CODE = P_PARAMETER_CODE;

*Mejores Prácticas
 FORMATEO DE DELETE
DELETE FROM TBL_PARAMETER
WHERE PARAMERTER_CODE =
P_PARAMERTER_CODE;

*Mejores Prácticas
 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;

*Mejores Prácticas
 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;

*Mejores Prácticas
 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;

*Mejores Prácticas
DOCUMENTACION DE PACKAGE
Evitar el uso de tildes en la documentación.
/**
 * Descripcion breve.
 * @author hbravo
 * @version 1.0 hbravo 20/02/2009.<br/>1.1 cgavidia
30/11/2009
 */

*Mejores Prácticas
DOC. PROCEDURE Y FUNCTION EN PACKAGE
Evitar el uso de tildes en la documentación.
/*
 * 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
 */

*Mejores Prácticas
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 (….

*Mejores Prácticas
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

*Mejores Prácticas
 TIPS DE MEJORES PRACTICAS
* Evitar usar arterísco en selección de campos
(SELECT * FROM).

* 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 cálculos en la clausula where ya que rompe los índices:


WHERE SALARY * 5 > P_SALARY;

*Mejores Prácticas
TIPS DE MEJORES PRACTICAS
* Evitar palabras reservadas en los nombres de objetos de Base de Datos.

* Colocar índices solo a las tablas que almacenarán un gran volumen de registros y que son
consultadas frecuentemente.

* Los parámetros que están 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, debería usar
igualdad.

* Al crear las tablas de base de datos los tipos numéricos deben ser NUMBER, y los tipos fecha DATE
y TIMESTAMP según lo requiera.

* La longitud máxima de los objetos de Base de Datos debe ser de 30 caracteres.

*Mejores Prácticas
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
);

*Mejores Prácticas
 REFERENCIAS Y BIBLIOGRAFIA
* http://
stackoverflow.com/questions/227037/can-i-get-better-performance-using-a-join-
or-using-exists
* http://
social.msdn.microsoft.com/Forums/es/sqlserveres/thread/779a9496-b99a-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-pldoc-plugin/2.0
* http://pldoc.sourceforge.net/maven-site/

*Mejores Prácticas

También podría gustarte