Fundamentals PL/SQL: Chapter 05 Working with Composite Data Types


17 Responses to “Fundamentals PL/SQL: Chapter 05 Working with Composite Data Types”

  1. Juan Pablo Angamarca Says:

    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;

  2. martincx Says:

    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;
    /

  3. martincx Says:

    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;
    ….

  4. Juan Pablo Angamarca Says:

    - 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;
    /

  5. Juan Pablo Angamarca Says:

    La salida del programa anterior es:

    Auto, 4, Wolkswagen, LBM045.
    PL/SQL procedure successfully completed.

  6. pdjaramillo Says:

    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

  7. Carlos Salazar Says:

    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.

  8. martincx Says:

    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;
    /
    _______________________________________________

  9. majito Says:

    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………

  10. marvin agila Says:

    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;

  11. Luid Feijoo Says:

    a mi tambien me presenta el mismo error de arriba

  12. Luis Feijoo Says:

    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.

  13. D. Armando Says:

    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;

  14. Juan Pablo S Says:

    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

  15. dguaman04 Says:

    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.

  16. marvin agila Says:

    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;

  17. claucar Says:

    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

Leave a Reply