0

このコードは、郵便番号、都市、および州の入力を受け取り、それを Address で作成されたテーブルに挿入します。データを挿入する前に、zipcode が既にテーブルにあるかどうかをチェックし、そうであれば、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

0

あなたの問題を正しく理解しているかどうかわかりませんが、あなたの問題に答えるために対処したい特定の修正があります

  • まず、プロシージャ/関数を作成する場合は、別のワークシートで作成してからコンパイルします。他の匿名ブロックと一緒にコンパイルしないでください。他のブロックを「/」で終了しないと、ほとんどの場合、エラーが確実に発生します。

  • 次に、DECLARE ステートメントの配置が間違っています。匿名ブロックを作成する場合は、DECLARE、BEGIN、および END が並んでいることを確認し、匿名ブロック内にプロシージャ/関数を作成しないでください。

  • 第 3 に、プロシージャで変数を宣言して使用していますが、初期値がないため、プロシージャの DML ステートメントに null 値を渡すだけです。パラメータを直接使用するだけです。

  • 第 4 に、dbms_output.put_line のみを含むプロシージャを作成しないようにします。ばかげている。

  • 最後に、プロシージャを呼び出す必要がある無名ブロックで「&」が使用されています。「&」は SQL*Plus の機能であり、PL/SQL では意味がないため、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 に答える