El ejemplo anterior podría ser más fácil de declarar si el registro está basado sobre una tabla de base de datos, esto utilizando %ROWTYPE el cual toma todos los campos y sus correspondientes tipos de datos; así:
- En mi comentario anterior la declaración está mal (vehicle my_pichirilo debería ser my_pichirilo vehicle;.
- La declaración de un tipo RECORD va en la sección DECLARE del bloque.
El siguiente bloque referencia los atributos de la variable record my_pichirilo.
SET SERVEROUTPUT ON
DECLARE
TYPE vehicle IS RECORD (
type VARCHAR2(20),
number_of_wheels NUMBER,
brand VARCHAR2(15),
number_plate VARCHAR(10));
En este ejemplo se muestra una tabla de registros usando la sentencia INDEX BY, que nos permite recorrer mediante un loop(ciclo repetitivo),y a la vez recuperar datos y almacenarlos en registros desde una tabla
SET SERVEROUTPUT ON
DECLARE
TYPE emp_table_type is table of
employees%rowtype INDEX BY BINARY_INTEGER;
my_emp_table emp_table_type;
v_count NUMBER(3):= 104;
BEGIN
FOR i IN 100..v_count
LOOP
SELECT * INTO my_emp_table(i)
FROM employees
WHERE employee_id = i;
END LOOP;
FOR i IN my_emp_table.FIRST..my_emp_table.LAST
LOOP
DBMS_OUTPUT.PUT_LINE(my_emp_table(i).last_name);
END LOOP;
END;
El Resultado es:
King
Kochhar
De Haan
Hunold
Ernst
PL/SQL procedure successfully completed
Que indica que esos empleados estan entre los ientificadores 100 y 104
En este ejemplo se utilizamos una Tabla de registros de index by , se muestra los valores en el rango de 1 a 4 de los registros de la tablas regions
Codigo:
SET SERVEROUTPUT ON
DECLARE
TYPE reg_table_type is table of regions%ROWTYPE INDEX BY BINARY_INTEGER;
my_reg_table reg_table_type;
v_count NUMBER(1):=4;
BEGIN
FOR i IN 1..v_count
LOOP
SELECT * INTO my_reg_table(i) FROM regions
WHERE region_id = i ;
END LOOP;
FOR i IN my_reg_table.FIRST..my_reg_table.LAST
LOOP
DBMS_OUTPUT.PUT_LINE(i||my_reg_table(i).region_name);
END LOOP;
END;
El resultado es :
1Europe
2Americas
3Asia
4Middle East and Africa
PL/SQL procedure successfully completed.
En este ejemplo (igual que el anterior, sólo que con la tabla regions y mostrando el índice y utilizando el método count).
DECLARE
TYPE regions_type is TABLE of
regions%ROWTYPE INDEX BY BINARY_INTEGER;
regiones regions_type;
total number;
BEGIN
FOR i IN 1..4
LOOP
select * into regiones(i) from regions
where region_id = i;
END LOOP;
total := regiones.count;
FOR i IN regiones.FIRST ..total
LOOP
DBMS_OUTPUT.PUT_LINE(regiones(i).region_name||’ ‘||i);
END LOOP;
END;
/
_______________________________________________
Xfa alguien ayudeme a ver en donde esta el error……………
SET SERVEROUTPUT ON
DECLARE
TYPE dep_table_type is table of
departments%ROWTYPE INDEX BY BINARY_INTEGER;
my_dep_table dep_table_type;
v_count NUMBER(3):=124;
BEGIN
FOR i IN 100..v_count
LOOP
SELECT* INTO my_dep_table(i) FROM departments
WHERE department_id=i;
END LOOP;
FOR i IN my_dep_table.FIRST..my_dep_table.LAST
LOOP
DBMS_OUTPUT.PUT_LINE(my_dep_table(i).department_name);
END LOOP;
END;
/
DECLARE
*
ERROR at line 1:
ORA-01403: no data found
ORA-06512: at line 9
este es el error que me presenta xfa ayudenme………
SET SERVEROUTPUT ON
DECLARE
TYPE job_table_type is table of JOB_GRADES%ROWTYPE INDEX BY BINARY_INTEGER;
my_job_table job_table_type;
v_count NUMBER(1):= 9;
BEGIN
FOR i IN 1..v_count
LOOP
SELECT * INTO my_job_table(i) FROM JOB_GRADES
WHERE job_grade = i;
END LOOP;
FOR i IN my_job_table.FIRST.. my_job_table.LAST
LOOP
DBMS_OUTPUT.PUT_LINE (my_job_table(i).grade_level);
END LOOP;
END;
cambie la inicilalizacion de la variable v_ count
v_count NUMBER(3) :=10;
SET SERVEROUTPUT ON
DECLARE
TYPE dep_table_type is table of
departments%rowtype INDEX BY BINARY_INTEGER;
my_dep_table dep_table_type;
v_count NUMBER(3) :=10;
BEGIN
FOR i IN 10..v_count
LOOP
SELECT * INTO my_dep_table(i) FROM departments
WHERE department_id = i;
END LOOP;
FOR i IN my_dep_table.FIRST..my_dep_table.LAST
LOOP
DBMS_OUTPUT.PUT_LINE(my_dep_table(i).department_name || i);
END LOOP;
END;
En los valores que se le da a COUNT, éste debe ser menor o igual al número de registros que posee dicha tabla, porque si es mayor arrojara el siguiente error:
ERROR at line 1:
ORA-01403: no data found
ORA-06512: at line 9
Una cosa más COUNT acepta valores con decimales, lo que efectua es un redondeo. Por ejemplo:
V_COUNT NUMBER(2) :=2.5;
SET SERVEROUTPUT ON
DECLARE
TYPE location is table of
locations%ROWTYPE INDEX BY BINARY_INTEGER;
my_location location;
v_count NUMBER(4):= 1400;
BEGIN
FOR i IN 1400..v_count
LOOP
SELECT * INTO my_location(i) FROM locations
WHERE location_id = i;
END LOOP;
FOR i IN my_location.FIRST..my_location.LAST
LOOP
DBMS_OUTPUT.PUT_LINE(my_location(i).city || i);
END LOOP;
END;
En este ejemplo utilizamos una Tabla de registros de index by , para la tabla locations..
Debido a que el ciclo repetitivo for no pude hacerlo que me incremente de 100 en 100 use el ciclo repetitivo while..
SET SERVEROUTPUT ON
DECLARE
TYPE loc_table_type IS TABLE OF locations%ROWTYPE INDEX BY BINARY_INTEGER;
my_loc_table loc_table_type;
v_count NUMBER(4):= 1400;
BEGIN
WHILE v_count <= 1500 LOOP
SELECT * INTO my_loc_table(v_count) FROM locations
WHERE location_id = v_count;
v_count := v_count+100;
END LOOP;
v_count := 1400;
WHILE v_count <= 1500 LOOP
BMS_OUTPUT.PUT_LINE(my_loc_table(v_count).city);
v_count := v_count+100;
END LOOP;
END;
/
el resultado de ésta sentencia es:
Southlake
South San Francisco
PL/SQL procedure successfully completed.
SET SERVEROUTPUT ON
DECLARE
TYPE job_table_type is table of JOB_HISTORYS%ROWTYPE INDEX BY BINARY_INTEGER;
my_job_table job_table_type;
v_count NUMBER(3):= 114;
BEGIN
FOR i IN 101..v_count
LOOP
SELECT * INTO my_job_table(i) FROM JOB_HISTORY
WHERE employee_id = i;
END LOOP;
FOR i IN my_job_table.FIRST.. my_job_table.LAST
LOOP
DBMS_OUTPUT.PUT_LINE (my_job_table(i).employee_id);
END LOOP;
END;
Por favor alguien puede ayudarme a ver en dónde está el error del siguiente código, ya que quiero hacer un recorrido de la tabla countries usando el ROWNUM de la tabla e INDEX BY y solo me funciona y retorna un valor cuando el v_count = 1 de lo contrario me da el error que muestro a continuación.
SET SERVEROUTPUT ON
DECLARE
TYPE country_table_type is table of
countries%ROWTYPE INDEX BY BINARY_INTEGER;
my_country_table country_table_type;
v_count NUMBER(3):=1;
BEGIN
FOR i IN 1..v_count
LOOP
SELECT * INTO my_country_table(i)
FROM countries
WHERE rownum = i;
END LOOP;
FOR i IN my_country_table.FIRST..my_country_table.LAST
LOOP
DBMS_OUTPUT.PUT_LINE(my_country_table(i).country_id||’ ‘||my_country_table(i).country_name||’ ‘||my_country_table(i).region_id);
END LOOP;
END;
/
DECLARE
*
ERROR at line 1:
ORA-01403: no data found
ORA-06512: at line 9
Mayo 7, 2008 at 7:57 pm
Ejemplo simple de definición de record para un vehículo: tipo, número de ruedas, marca y número de matrícula.
TYPE vehicle IS RECORD (
type VARCHAR2(20),
number_of_wheels NUMBER,
brand VARCHAR2(15),
number_plate VARCHAR2(10)
);
Declarar un record de este tipo:
vehicle my_pichirilo;
Mayo 7, 2008 at 8:02 pm
Yo declaro un record que muestra a un empleado y luego en un bloque pl/sql muestro como referenciar sus campos de una manera fácil.
DECLARE
TYPE emp_record is RECORD
(last_name varchar2(25),
job_id varchar2(10),
salary number(8,2));
empleado emp_record;
begin
empleado.last_name := ‘Martin Fierro’;
empleado.job_id :=’AV_PRESS’;
empleado.salary := 12522.2;
DBMS_OUTPUT.PUT_LINE(’Yo ‘||empleado.last_name||’ gano $’||to_char(empleado.salary)||’ pues soy ‘||empleado.job_id);
end;
/
Mayo 7, 2008 at 8:09 pm
El ejemplo anterior podría ser más fácil de declarar si el registro está basado sobre una tabla de base de datos, esto utilizando %ROWTYPE el cual toma todos los campos y sus correspondientes tipos de datos; así:
DECLARE
my_record employees%ROWTYPE;
….
Mayo 7, 2008 at 8:18 pm
- En mi comentario anterior la declaración está mal (vehicle my_pichirilo
debería ser my_pichirilo vehicle;.
- La declaración de un tipo RECORD va en la sección DECLARE del bloque.
El siguiente bloque referencia los atributos de la variable record my_pichirilo.
SET SERVEROUTPUT ON
DECLARE
TYPE vehicle IS RECORD (
type VARCHAR2(20),
number_of_wheels NUMBER,
brand VARCHAR2(15),
number_plate VARCHAR(10));
my_pichirilo VEHICLE;
BEGIN
my_pichirilo.type := 'Auto';
my_pichirilo.number_of_wheels := 4;
my_pichirilo.brand := 'Wolkswagen';
my_pichirilo.number_plate := 'LBM045';
DBMS_OUTPUT.PUT_LINE(my_pichirilo.type || ', ' || my_pichirilo.number_of_wheels || ', ' || my_pichirilo.brand || ', ' || my_pichirilo.number_plate || '.');
END;
/
Mayo 7, 2008 at 8:19 pm
La salida del programa anterior es:
Auto, 4, Wolkswagen, LBM045.
PL/SQL procedure successfully completed.
Mayo 8, 2008 at 7:31 pm
En este ejemplo se muestra una tabla de registros usando la sentencia INDEX BY, que nos permite recorrer mediante un loop(ciclo repetitivo),y a la vez recuperar datos y almacenarlos en registros desde una tabla
SET SERVEROUTPUT ON
DECLARE
TYPE emp_table_type is table of
employees%rowtype INDEX BY BINARY_INTEGER;
my_emp_table emp_table_type;
v_count NUMBER(3):= 104;
BEGIN
FOR i IN 100..v_count
LOOP
SELECT * INTO my_emp_table(i)
FROM employees
WHERE employee_id = i;
END LOOP;
FOR i IN my_emp_table.FIRST..my_emp_table.LAST
LOOP
DBMS_OUTPUT.PUT_LINE(my_emp_table(i).last_name);
END LOOP;
END;
El Resultado es:
King
Kochhar
De Haan
Hunold
Ernst
PL/SQL procedure successfully completed
Que indica que esos empleados estan entre los ientificadores 100 y 104
Mayo 8, 2008 at 8:05 pm
En este ejemplo se utilizamos una Tabla de registros de index by , se muestra los valores en el rango de 1 a 4 de los registros de la tablas regions
Codigo:
SET SERVEROUTPUT ON
DECLARE
TYPE reg_table_type is table of regions%ROWTYPE INDEX BY BINARY_INTEGER;
my_reg_table reg_table_type;
v_count NUMBER(1):=4;
BEGIN
FOR i IN 1..v_count
LOOP
SELECT * INTO my_reg_table(i) FROM regions
WHERE region_id = i ;
END LOOP;
FOR i IN my_reg_table.FIRST..my_reg_table.LAST
LOOP
DBMS_OUTPUT.PUT_LINE(i||my_reg_table(i).region_name);
END LOOP;
END;
El resultado es :
1Europe
2Americas
3Asia
4Middle East and Africa
PL/SQL procedure successfully completed.
Mayo 8, 2008 at 8:12 pm
En este ejemplo (igual que el anterior, sólo que con la tabla regions y mostrando el índice y utilizando el método count).
DECLARE
TYPE regions_type is TABLE of
regions%ROWTYPE INDEX BY BINARY_INTEGER;
regiones regions_type;
total number;
BEGIN
FOR i IN 1..4
LOOP
select * into regiones(i) from regions
where region_id = i;
END LOOP;
total := regiones.count;
FOR i IN regiones.FIRST ..total
LOOP
DBMS_OUTPUT.PUT_LINE(regiones(i).region_name||’ ‘||i);
END LOOP;
END;
/
_______________________________________________
Mayo 8, 2008 at 8:19 pm
Xfa alguien ayudeme a ver en donde esta el error……………
SET SERVEROUTPUT ON
DECLARE
TYPE dep_table_type is table of
departments%ROWTYPE INDEX BY BINARY_INTEGER;
my_dep_table dep_table_type;
v_count NUMBER(3):=124;
BEGIN
FOR i IN 100..v_count
LOOP
SELECT* INTO my_dep_table(i) FROM departments
WHERE department_id=i;
END LOOP;
FOR i IN my_dep_table.FIRST..my_dep_table.LAST
LOOP
DBMS_OUTPUT.PUT_LINE(my_dep_table(i).department_name);
END LOOP;
END;
/
DECLARE
*
ERROR at line 1:
ORA-01403: no data found
ORA-06512: at line 9
este es el error que me presenta xfa ayudenme………
Mayo 8, 2008 at 8:20 pm
http://www.elsuperdepor.com
en este ejemplo se hara uso de la tabla countries
SET SERVEROUTPUT ON
DECLARE
TYPE job_table_type is table of JOB_GRADES%ROWTYPE INDEX BY BINARY_INTEGER;
my_job_table job_table_type;
v_count NUMBER(1):= 9;
BEGIN
FOR i IN 1..v_count
LOOP
SELECT * INTO my_job_table(i) FROM JOB_GRADES
WHERE job_grade = i;
END LOOP;
FOR i IN my_job_table.FIRST.. my_job_table.LAST
LOOP
DBMS_OUTPUT.PUT_LINE (my_job_table(i).grade_level);
END LOOP;
END;
Mayo 8, 2008 at 8:21 pm
a mi tambien me presenta el mismo error de arriba
Mayo 8, 2008 at 8:32 pm
cambie la inicilalizacion de la variable v_ count
v_count NUMBER(3) :=10;
SET SERVEROUTPUT ON
DECLARE
TYPE dep_table_type is table of
departments%rowtype INDEX BY BINARY_INTEGER;
my_dep_table dep_table_type;
v_count NUMBER(3) :=10;
BEGIN
FOR i IN 10..v_count
LOOP
SELECT * INTO my_dep_table(i) FROM departments
WHERE department_id = i;
END LOOP;
FOR i IN my_dep_table.FIRST..my_dep_table.LAST
LOOP
DBMS_OUTPUT.PUT_LINE(my_dep_table(i).department_name || i);
END LOOP;
END;
Me presnto este valor
Administration
PL/SQL procedure successfully completed.
Mayo 8, 2008 at 8:33 pm
En los valores que se le da a COUNT, éste debe ser menor o igual al número de registros que posee dicha tabla, porque si es mayor arrojara el siguiente error:
ERROR at line 1:
ORA-01403: no data found
ORA-06512: at line 9
Una cosa más COUNT acepta valores con decimales, lo que efectua es un redondeo. Por ejemplo:
V_COUNT NUMBER(2) :=2.5;
Mayo 8, 2008 at 8:51 pm
SET SERVEROUTPUT ON
DECLARE
TYPE location is table of
locations%ROWTYPE INDEX BY BINARY_INTEGER;
my_location location;
v_count NUMBER(4):= 1400;
BEGIN
FOR i IN 1400..v_count
LOOP
SELECT * INTO my_location(i) FROM locations
WHERE location_id = i;
END LOOP;
FOR i IN my_location.FIRST..my_location.LAST
LOOP
DBMS_OUTPUT.PUT_LINE(my_location(i).city || i);
END LOOP;
END;
Respuesta
Southlake1400
Mayo 8, 2008 at 8:52 pm
En este ejemplo utilizamos una Tabla de registros de index by , para la tabla locations..
Debido a que el ciclo repetitivo for no pude hacerlo que me incremente de 100 en 100 use el ciclo repetitivo while..
SET SERVEROUTPUT ON
DECLARE
TYPE loc_table_type IS TABLE OF locations%ROWTYPE INDEX BY BINARY_INTEGER;
my_loc_table loc_table_type;
v_count NUMBER(4):= 1400;
BEGIN
WHILE v_count <= 1500 LOOP
SELECT * INTO my_loc_table(v_count) FROM locations
WHERE location_id = v_count;
v_count := v_count+100;
END LOOP;
v_count := 1400;
WHILE v_count <= 1500 LOOP
BMS_OUTPUT.PUT_LINE(my_loc_table(v_count).city);
v_count := v_count+100;
END LOOP;
END;
/
el resultado de ésta sentencia es:
Southlake
South San Francisco
PL/SQL procedure successfully completed.
Mayo 8, 2008 at 8:54 pm
ayuda con este ejemplo
http://www.elsuperdepor.com
en este ejemplo se hara uso de la tabla countries
SET SERVEROUTPUT ON
DECLARE
TYPE job_table_type is table of JOB_HISTORYS%ROWTYPE INDEX BY BINARY_INTEGER;
my_job_table job_table_type;
v_count NUMBER(3):= 114;
BEGIN
FOR i IN 101..v_count
LOOP
SELECT * INTO my_job_table(i) FROM JOB_HISTORY
WHERE employee_id = i;
END LOOP;
FOR i IN my_job_table.FIRST.. my_job_table.LAST
LOOP
DBMS_OUTPUT.PUT_LINE (my_job_table(i).employee_id);
END LOOP;
END;
Mayo 12, 2008 at 7:10 pm
Por favor alguien puede ayudarme a ver en dónde está el error del siguiente código, ya que quiero hacer un recorrido de la tabla countries usando el ROWNUM de la tabla e INDEX BY y solo me funciona y retorna un valor cuando el v_count = 1 de lo contrario me da el error que muestro a continuación.
SET SERVEROUTPUT ON
DECLARE
TYPE country_table_type is table of
countries%ROWTYPE INDEX BY BINARY_INTEGER;
my_country_table country_table_type;
v_count NUMBER(3):=1;
BEGIN
FOR i IN 1..v_count
LOOP
SELECT * INTO my_country_table(i)
FROM countries
WHERE rownum = i;
END LOOP;
FOR i IN my_country_table.FIRST..my_country_table.LAST
LOOP
DBMS_OUTPUT.PUT_LINE(my_country_table(i).country_id||’ ‘||my_country_table(i).country_name||’ ‘||my_country_table(i).region_id);
END LOOP;
END;
/
DECLARE
*
ERROR at line 1:
ORA-01403: no data found
ORA-06512: at line 9