1

您好,我是一名 php 开发人员,正在尝试使用 Oracle。所以我需要将一组变量传递给 Oracle 存储过程。所以作为一个基本的尝试,我试图访问一个接受三个参数的过程,其中两个是可变数组,但是当我传递声明的可变数组时,我得到了一个错误。我很确定,这与一些语法有关,但我无法弄清楚那件事。

下面是我的表模式和存储过程:

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 回答