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;