2015-11-10 2 views
0

Этот код принимает ввод для zipcode, city и state, а затем вставляет его в таблицу, созданную Address. Перед вставкой данных он проверяет, находится ли zipcode в таблице, если такая процедура вызова (ошибка) отображает код ошибки.Pl SQL Oracle PLS-00103: встречается символ «CREATE»

Im, получая код ошибки 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; 
/
+0

Что такое 'в' /' out' делать в 'создать table' заявление? –

+0

не было, чтобы там было исправлено, извините – rob

+0

'порядок расположения (zzip, ccity, sstate);' неверно. Вы не называете такую ​​процедуру. –

ответ

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

удачи.

+0

, но это не значит, что нужно вводить пользовательский ввод для zipcode, city и state. Затем проверьте, находится ли этот zipcode уже в созданном адресе таблицы. Если это ошибка отображения, если вы не вставляете данные – rob

+0

спасибо вам большое @bobjarvis.В конце кода выберите & city в ccity из dual; есть ли какие-либо изменения, чтобы принять название города. Он должен принять varchar2 (30), не так ли? – rob

+0

nevermind, используя «вокруг входа исправил его :) Еще раз спасибо! – rob

0

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

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

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

  • В-третьих, вы объявляете переменные в своих процедурах и их использовании, но оленья кожа имеет начальное значение, так что это будет просто передать нулевое значение заявления 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;