2011-02-03 17 views
1

こんにちは私はPHP開発者であり、Oracleと一緒に働こうとしています。だから私はOracleのストアドプロシージャに変数のコレクションを渡す必要があります。基本的な試みとして、私は3つのパラメータを受け入れるプロシージャにアクセスしようとしていますが、2つはVARRAYですが、宣言した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('[email protected]','[email protected]','[email protected]'); 
friends := friend_list('kwaja','sayya','mayya'); 
execute update_address_book('1',emails,friends); 
end; 

私は取得していますエラーが実行に近いですが、私は私はdeclareブロックの内部でプロシージャを実行することになっていないと思うが、私は回避する方法を理解することができません。

答えて

3

PL/SQLブロック内からプロシージャをコールする場合は、キーワードEXECUTEは不要です。その言葉を削除するだけです。

しかし、何か間違っている可能性があるため、実際のエラーが表示された場合は役立ちます。たとえば、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; 
/
+0

はあなたにアレックスに感謝!データ型の実行と間違った宣言は問題でした:) – macha

関連する問題