2009-10-22 5 views
10

ich die folgenden Arten in meinem PL/SQL-Paket deklariert haben:Tables of Records in PL/SQL verwenden

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; 

Dann erkläre ich eine Variable:

obj t_obj_table; 

Allerdings, wenn ich will die Variable zu verwenden, kann ich es nicht initialisieren oder erweitern:

obj := t_obj_table(); 

gibt folgende errror:

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

Wenn ich es nicht initialisieren, ich kann es nicht verlängern einige Datum als

obj.EXTEND(); 

hinzuzufügen gibt einen weiteren Fehler:

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

Wie kann ich diese Arbeit machen?

Antwort

19

Sie eine Tabelle indiziert durch „etwas“ nicht erweitern, können Sie es einfach verwenden ...

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

Um die Syntax VERLÄNGERN verwenden, dieses Beispiel sollte tun es ...

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

auch this link (Ask Tom)

7

Sie können ein assoziatives Array nicht erweitern. nur Werte zuweisen es

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

Wenn Sie sehen, don Ich möchte kein assoziatives Array verwenden (auch bekannt als Index-by-Tabelle) und dann die Klausel "INDEX BY BINARY_INTEGER" weglassen. Der Code funktioniert dann 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

Oder benutzen Sie einfach einen Datensatz (oder assoziatives Array von Datensätzen)

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;