Передать переменные varray в хранимую процедуру — базовая

Здравствуйте, я разработчик php, пытаюсь начать работать с Oracle. Поэтому мне нужно передать набор переменных в хранимую процедуру Oracle. Итак, в качестве базовой попытки я пытаюсь получить доступ к процедуре, которая принимает три параметра, из которых два будут varrays, но когда я передаю объявленные varrays, я получаю сообщение об ошибке. Я почти уверен, что это как-то связано с небольшим синтаксисом, но я не могу понять это.

Ниже приведена моя схема таблицы и хранимая процедура:

create table emails (
user_id varchar2(10),
friend_name varchar2(20),
email_address varchar2(20));

create or replace type email_array as varray(100) of varchar2(20);
/
show errors
create or replace type friend_array as varray(100) of varchar2(20);
/
show errors

create or replace procedure update_address_book(
p_user_id in varchar2,
p_friend_name friend_array,
p_email_addresses email_array)
is
begin
delete from emails where user_id = p_user_id;
forall i in indices of p_email_addresses
insert into emails (user_id, friend_name, email_address)
values (p_user_id, p_friend_name(i), p_email_addresses(i));
end update_address_book;

Теперь ниже вставлено то, как я пытаюсь получить доступ к этой процедуре из анонимного блока.

declare 
  type email_list is varray(100) of varchar2(20);
  type friend_list is varray(100) of varchar2(20);
  emails email_list;
  friends friend_list;
begin
 emails :=email_list('[email protected]','[email protected]','[email protected]');
 friends := friend_list('kwaja','sayya','mayya');
 execute update_address_book('1',emails,friends);
end; 

Ошибка, которую я получаю, близка к выполнению, я думаю, что я не должен выполнять процедуру внутри блока объявления, но я не могу понять, как мне обойти это.


person macha    schedule 03.02.2011    source источник


Ответы (1)


Для вызвать процедуру из блока PL/SQL. Просто уберите это слово.

Но было бы полезно, если бы вы показали фактические ошибки, которые вы получаете, поскольку может быть что-то еще не так. Например, у вас также есть параметры для вызова update_address_book() в неправильном порядке, и вы воссоздаете новые типы внутри своего блока вместо использования объявленных ранее.

Это будет работать:

declare 
    emails email_array;
    friends friend_array;
begin
    emails := email_array('[email protected]','[email protected]','[email protected]');
    friends := friend_array('kwaja','sayya','mayya');
    update_address_book('1',friends,emails);
end;
/
person Alex Poole    schedule 03.02.2011
comment
спасибо алекс!! Выполнение и неправильное объявление типа данных были проблемами :) - person macha; 04.02.2011