Pl SQL Oracle PLS-00103: обнаружен символ "СОЗДАТЬ"

Этот код принимает данные для почтового индекса, города и штата, а затем вставляет их в таблицу Address. Перед вставкой данных он проверит, есть ли почтовый индекс в таблице, если это так, вызывая процедуру (ошибка), чтобы отобразить код ошибки.

Я получаю код ошибки 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;
/

2 ответа

Решение

Я не уверен, что вы пытаетесь сделать, но следующее может быть ближе к тому, что вы имели в виду:

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;
/

Удачи.

Я не знаю, правильно ли я понимаю вашу проблему, но есть определенное исправление, к которому я хотел бы обратиться, чтобы ответить на вашу проблему

  • Во-первых, если вы собираетесь создать процедуру / функцию, сделайте это на отдельной рабочей таблице, а затем скомпилируйте ее. Не компилируйте его вместе с другими анонимными блоками, потому что в большинстве случаев, если вы не заканчиваете другие блоки с помощью '/', ошибки наверняка будут генерироваться.

  • Во-вторых, ваша инструкция 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;
Другие вопросы по тегам