0

此代码接受邮政编码、城市和州的输入,然后将其插入到创建的地址表中。在插入数据之前,它将检查邮政编码是否已经在表中,如果是,则调用 procedure(error) 以显示错误代码。

我收到错误代码 pls-00103:尝试执行代码时遇到符号“CREATE”。到目前为止,这是我的代码。感谢您提前提供任何帮助。

drop table address;

create table address(zipcode NUMBER, city varchar2(30), state varchar2(20));

create or replace procedure error as
begin
  dbms_output.put_line('Error Zip Code already found in table');
end error;

declare
 zzip number;
 ccity varchar2(30);
 sstate varchar2(30);

create or replace procedure location(p_zipcode NUMBER,
                                     p_city varchar2,
                                     p_state varchar2) is
zip address.zipcode%type;
cit address.city%type;
st address.state%type;

begin
  select count(*) from address into zip where zipcode = zip;
  if any_rows_found then 
    error;
  else
  Insert into address values(zip, cit, st);
  end if;
end location;

begin
  select &zipcode into zzip from dual;
  select &city into ccity from dual;
  select &state into sstate from dual;
  procedure location(zzip, ccity, sstate);
end;
/
4

2 回答 2

1

我不确定您要做什么,但以下内容可能更接近您的想法:

drop table address;

create table address(zipcode NUMBER, city varchar2(30), state varchar2(20));

declare
 zzip number;
 ccity varchar2(30);
 sstate varchar2(30);

 procedure error is
 begin
  dbms_output.put_line('Error Zip Code already found in table');
 end error;

 procedure location(p_zipcode NUMBER, p_city varchar2, p_state varchar2) is
  zip_count   NUMBER;
 begin
  select count(*)
    into zip_count
    from address
    where zipcode = p_zipcode;

  if zip_count > 0 then 
    error;
  else
   Insert into address
     (zipcode, city, state)
   values
     (p_zipcode, p_city, p_state);
  end if;
 end location;

begin
 select &zipcode into zzip from dual;
 select &city into ccity from dual;
 select &state into sstate from dual;

 location(zzip, ccity, sstate);
end;
/

祝你好运。

于 2015-11-10T02:58:55.687 回答
0

我不知道我是否正确理解了您的问题,但是我想解决某些更正以回答您的问题

  • 首先,如果您要创建一个过程/函数,请在单独的工作表中进行,然后编译它。不要将它与其他匿名块一起编译,因为大多数情况下,如果您不以'/'结束其他块,肯定会产生错误。

  • 其次,您的 DECLARE 语句放错了位置,如果您要创建一个匿名块,请确保 DECLARE、BEGIN 和 END 对齐,不要在匿名块内创建过程/函数。

  • 第三,您在过程中声明变量并使用它们,但没有初始值,因此它只会将空值传递给过程中的 DML 语句。直接使用参数即可。

  • 第四,避免创建只包含 dbms_output.put_line 的过程。它很傻。

  • 最后,应该调用您的过程的匿名块使用“&”,请避免在 pl/sql 中使用“&”,因为“&”是 SQL*Plus 中的一个功能,在 PL/SQL 中没有任何意义,相反,您可以使用 ':' 作为绑定变量。但是你在绑定变量中没有使用'&',所以你应该删除它;

尝试这个:

drop table address;

 /

create table address(zipcode NUMBER, city varchar2(30), state varchar2(20));

 / 

create or replace procedure location(p_zipcode NUMBER, 
                                     p_city varchar2,    
                                     p_state varchar2) is

zip address.zipcode%type;


begin
  select count(*) 
    from address 
    into zip 
    where zipcode = p_zipcode 
             and city =p_city 
                and state = p_state;

  if zip > 0 then 
   dbms_output.put_line('Error Zip Code already found in table');
  else
  Insert into address values(p_zipcode, p_city, p_state);
  end if;
end location;

/


begin

 location(:zzip, :ccity, :sstate);

end;
于 2015-11-10T03:23:00.060 回答