2009-10-22 14 views
10

Mam deklarowanej następujące typy w moim PL/SQL pakietu:użyciu tabel rekordów w PL/SQL

TYPE t_simple_object IS RECORD (
    wert NUMBER, 
    gs  NUMBER, 
    vl  NUMBER); 

TYPE t_obj_table IS TABLE OF t_simple_object 
    INDEX BY BINARY_INTEGER; 

Potem zadeklarować zmienną:

obj t_obj_table; 

Jednak kiedy chcę aby użyć zmiennej, nie mogę zainicjować lub rozszerzyć go:

obj := t_obj_table(); 

daje następujące errror:

PLS-00222: no function with name 'T_OBJ_TABLE' exists in this scope 

Jeśli nie będę go zainicjować, nie mogę przedłużyć go dodać trochę datę jako

obj.EXTEND(); 

daje kolejny błąd:

PLS-00306: wrong number or types of arguments in call to 'EXTEND' 

Jak mogę dokonać tej pracy?

Odpowiedz

19

Nie rozszerzyć tabeli indeksowane przez „coś”, można po prostu używać go ...

DECLARE 
    TYPE t_simple_object IS RECORD 
     (wert NUMBER 
     , gs  NUMBER 
     , vl  NUMBER 
    ); 

    TYPE t_obj_table IS TABLE OF t_simple_object 
    INDEX BY BINARY_INTEGER; 

    my_rec t_simple_object; 
    obj t_obj_table; 
BEGIN 
    my_rec.wert := 1; 
    my_rec.gs := 1; 
    my_rec.vl := 1; 
    obj(1) := my_rec; 
END; 
/

Aby użyć składni rozszerzać ten przykład powinien zrób to ...

DECLARE 
    TYPE t_simple_object IS RECORD 
     (wert NUMBER 
     , gs  NUMBER 
     , vl  NUMBER 
    ); 

    TYPE t_obj_table IS TABLE OF t_simple_object; 

    my_rec t_simple_object; 
    obj t_obj_table := t_obj_table(); 
BEGIN 
    obj.EXTEND; 
    my_rec.wert := 1; 
    my_rec.gs := 1; 
    my_rec.vl := 1; 
    obj(1) := my_rec; 
END; 
/

zobaczyć również this link (Ask Tom)

7

Nie można rozszerzyć tablicy asocjatywnej. Wystarczy przypisać wartości do niego

declare 
    TYPE t_simple_object IS RECORD (
    wert NUMBER, 
    gs  NUMBER, 
    vl  NUMBER); 

    TYPE t_obj_table IS TABLE OF t_simple_object INDEX BY BINARY_INTEGER; 

    simple_object t_simple_object; 
begin 
    simple_object.wert := 1; 
    simple_object.gs := 2; 
    simple_object.vl := 3; 
    obj(1) := simple_object; 
end; 
/
7

jeśli nie nie chcesz używać tablicy asocjacyjnej (inaczej tabeli według indeksów), a następnie pomiń klauzulę "INDEX BY BINARY_INTEGER". Twój kod następnie działa OK:

declare 
    TYPE t_simple_object IS RECORD (
     wert NUMBER, 
     gs  NUMBER, 
     vl  NUMBER); 
    TYPE t_obj_table IS TABLE OF t_simple_object; 
    obj t_obj_table; 
begin 
    obj := t_obj_table(); 
    obj.EXTEND(); 
end; 
0

Albo po prostu użyć rekord (lub stowarzyszonej tablicę rekordów)

create or replace package p_test is 

    type t_rec is record (
    empname varchar2(50), 
    empaddr varchar2(50)); 

    function p_test_ret_record return t_rec; 

end p_test; 


create or replace package body p_test is 

    function p_test_ret_record return t_rec is 
    l_rec t_rec; 
    begin 
    l_rec.empname := 'P1'; 
    l_rec.empaddr := 'P2';  
    return l_rec; 
    end; 

end p_test; 

declare 
    -- Non-scalar parameters require additional processing 
    result p_test.t_rec; 
begin 
    -- Call the function 
    result := p_test.p_test_ret_record; 
    dbms_output.put_line('Name: ' || result.empname || ' Addr: ' || result.empaddr); 
end; 
Powiązane problemy