1

こんにちは、私は PHP 開発者であり、Oracle を使用しようとしています。そのため、変数のコレクションを Oracle ストアド プロシージャに渡す必要があります。したがって、基本的な試行として、3 つのパラメーターを受け入れるプロシージャーにアクセスしようとしています。そのうちの 2 つは varray ですが、宣言された varray を渡すと、エラーが発生します。それはちょっとした構文と関係があると確信していますが、それを理解することはできません。

以下は、私のテーブル スキーマとストアド プロシージャです。

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('khwaja@gmail.com','sayya@gmail.com','mayya@gmail.com');
 friends := friend_list('kwaja','sayya','mayya');
 execute update_address_book('1',emails,friends);
end; 

取得しているエラーは実行の近くにあります。宣言ブロック内でプロシージャを実行することは想定されていないと思いますが、回避方法を理解できません。

4

1 に答える 1

3

PL / SQLブロック内からプロシージャを呼び出すために、キーワードEXECUTEは必要ありません。その単語を削除するだけです。

ただし、他に何か問題がある可能性があるため、実際に発生しているエラーを表示すると便利です。たとえば、update_address_book()呼び出しのパラメーターが間違った順序であり、以前に宣言されたタイプを使用する代わりに、ブロック内に新しいタイプを再作成しているとします。

これは実行されます:

declare 
    emails email_array;
    friends friend_array;
begin
    emails := email_array('khwaja@gmail.com','sayya@gmail.com','mayya@gmail.com');
    friends := friend_array('kwaja','sayya','mayya');
    update_address_book('1',friends,emails);
end;
/
于 2011-02-03T22:48:18.823 に答える