Saturday, October 27, 2007

Declaraciones anclado - %TYPE y %ROWTYPE

Cuando se declara una variable, hay que darle un tipo de datos y de un tamaño.

Vamos a suponer por un momento que tengo una tabla que se parece a esto:

SQL> desc employees
Name Null? Type
----------------------------------------- -------- ----------------------------
EMPLOYEE_ID NOT NULL NUMBER(6)
FIRST_NAME VARCHAR2(20)
LAST_NAME NOT NULL VARCHAR2(25)
EMAIL NOT NULL VARCHAR2(25)
PHONE_NUMBER VARCHAR2(20)
HIRE_DATE NOT NULL DATE
JOB_ID NOT NULL VARCHAR2(10)
SALARY NUMBER(8,2)
COMMISSION_PCT NUMBER(2,2)
MANAGER_ID NUMBER(6)
DEPARTMENT_ID NUMBER(4)
SQL>


Podría crear un pl/sql- código de la unidad que acceder a algunas de estas columnas. Por ejemplo:

DECLARE
v_employee_id NUMBER(6);
v_hire_date DATE;
v_last_name VARCHAR2(25);
BEGIN
SELECT employee_id, last_name, hire_date
INTO v_employee_id, v_last_name, v_hire_date
FROM employees
WHERE rownum = 1;
END;


En este fragmento de código, declaró el número 6 dígitos de longitud, una fecha y un varchar2 de 25 caracteres de largo. Aunque estos tamaños coinciden con mi cuadro, hay una forma mejor de hacer esto:

DECLARE
v_employee_id employees.employee_id%TYPE;
v_hire_date employees.hire_date%TYPE;
v_last_name employees.last_name%TYPE;
BEGIN
SELECT employee_id, last_name, hire_date
INTO v_employee_id, v_last_name, v_hire_date
FROM employees
WHERE rownum = 1;
END;


Mismos resultados, pero ahora mi software es sólo un poco más fácil de mantener. Si yo uso constantemente %TYPE todo mi código, puede cambiar el tamaño de columna con un poco menos preocupación. Técnicamente, puede ser capaz de cambiar los tipos de datos y estar bien, pero he encontrado que, en la práctica, cuando el usuario cambia los tipos de datos, se necesitará revisar una gran cantidad de su código.

%TYPE es usado cuando usted se refiere son las columnas individuales. Hay muchos casos en donde será usado toda una fila. En lugar de crear manualmente un tipo de registro, puede declarar una variable de %ROWTYPE. Por ejemplo, a continuación voy a seleccionar todas las columnas de mi tabla:

DECLARE
v_employees employees%ROWTYPE;
BEGIN
SELECT *
INTO v_employees
FROM employees
WHERE rownum = 1;
END;


Esta recoge la totalidad de las columnas y los ponga a disposición en su programa. Puede detallar cada una de las columnas en su lista de selección como este:

DECLARE
v_employees employees%ROWTYPE;
BEGIN
SELECT employee_id, first_name, last_name,
email, phone_number, hire_date, job_id, salary,
commission_pct, manager_id, department_id
INTO v_employees
FROM employees
WHERE rownum = 1;
END;


Si lo hace detallar cada una de las columnas, es necesario mantenerlos en las columnas en el mismo orden que se declaran en su mesa. Si añade una columna de la tabla, tendrá que modificar su código.

"SELECT *" es más fácil de leer. Asimismo, en los casos en que es necesario recoger las nuevas columnas (por lo general, los procedimientos de mantenimiento tipo), "SELECT *" recoge nuevas columnas con un solo recompilar, en contraposición a la necesidad de añadir manualmente las columnas.

Este es un caso en el que usted necesita para hacer una llamada en cuanto a si un "SELECT *" es una mala cosa o no. Yo no tengo un problema con el "SELECT *" en estos casos. En realidad, me atrevería a decir incluso recomendar que en el caso de que usted realmente necesita todas las columnas (o incluso la mayoría de las columnas). Me doy cuenta de que es una herejía para muchos. Oh, bien.

Una última nota es que %TYPE y %ROWTYPE también como parámetros de trabajo y es una gran manera de enviar datos en torno a que es arrastrada desde su base de datos. Por ejemplo:

CREATE OR REPLACE 
PROCEDURE get_employee( p_employee_rec OUT employees%ROWTYPE )
AS
BEGIN
SELECT *
INTO p_employee_rec
FROM employees
WHERE rownum = 1;
END;


Este fragmento de código devolverá un registro de los datos del empleado a la llamada de rutina.

%TYPE y %ROWTYPE se llaman anclado declaraciones. Básicamente, usted es el tipo de datos de su anclaje declaraciones a la columna de definiciones en su base de datos. Además de asegurar que sus datos tipos y tamaños siempre coinciden, se hace más fácil ya que el código no tiene que buscar los tamaños, así como cada vez que escribir un pedazo de código.

Utilice anclado declaraciones. Utilizar de manera consecuente y la gente que sigue a lo largo de atrás para mantener su código gracias.

4 comments:

Albeticom said...

Sigue asi tio muchas gracias por tu aportación.

Programación al extremo said...

Hola muy Buenas
Aprendí mucho acerca de como utilizar las columnas y filas en Oracle
Gracias
Cordialmente Programación al Extremo

Luis said...

Estimado Puedes hablar mas sobre directriz literal de plsql, sobre cursores implicitos e explicitos

caxaj17 said...

Excelente manera de explicar y no complicarse con los dos tipos que hacen de la vida un poco mas sencilla, Mil Gracias.

My Zimbio
KudoSurf Me!