Использование таблиц записей в PL/SQL
Я объявлял следующие типы в своем 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;
Затем объявляю переменную:
obj t_obj_table;
Однако, когда я хочу использовать переменную, я не могу ее инициализировать или расширять:
obj := t_obj_table ();
дает следующее сообщение об ошибке:
PLS-00222: no function with name 'T_OBJ_TABLE' exists in this scope
Если я не инициализирую его, я не могу его продлить, чтобы добавить дату как
obj.EXTEND();
дает еще одну ошибку:
PLS-00306: wrong number or types of arguments in call to 'EXTEND'
Как я могу сделать эту работу?
Ответы
Ответ 1
Вы не расширяете таблицу, индексированную "чем-то", вы можете просто использовать ее...
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;
/
Чтобы использовать синтаксис EXTEND, этот пример должен сделать это...
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;
/
Также см. эту ссылку (Ask Tom)
Ответ 2
Вы не можете расширить ассоциативный массив.
Просто присвойте ему значения
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;
/
Ответ 3
Если вы не хотите использовать ассоциативный массив (aka index-by table), то оставьте предложение "INDEX BY BINARY_INTEGER". Затем ваш код работает нормально:
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;
Ответ 4
Или просто используйте запись (или связать массив записей)
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;