0

ユーザーからの入力を取得する PL/SQL スクリプトを実行しており、1 つまたは 2 つのテーブルにデータを追加する必要があるかどうかを if ステートメントで確認します。このタスクを実行するために IF ステートメントと WHILE ループを使用していますが、正しく機能していません。また、このスクリプトはメイン メニューの一部です。どんな入力でも大歓迎です。

-- q3.sql
-- Question name goes here!!

VARIABLE g_options VARCHAR2(1000);

PROMPT 'Vehicle Inventory Record'
ACCEPT p_Options PROMPT 'Does this car has any Optional Equipment or Accessories?(YES    or NO)';
-- Option table
ACCEPT p_OCode PROMPT 'Enter the code for the option picked (Ex. CD2):'
ACCEPT p_ODescription PROMPT 'Enter the description for the option picked:'
ACCEPT p_OPrice PROMPT 'Enter the price for the option picked:'
-- Car table
ACCEPT p_SerialNo PROMPT 'What is the serial number of the car?'
ACCEPT p_Make PROMPT 'What is the make of the car?'
ACCEPT p_Model PROMPT 'What is the model of the car?'
ACCEPT p_Year PROMPT 'What is the color of the car?'
ACCEPT p_Trim PROMPT 'What is the trim of the car?'
ACCEPT p_PurchFrom PROMPT 'Where was the car purchased from?'
ACCEPT p_PurchInvNo PROMPT 'What was the invoice number of the purcahse?'
ACCEPT p_PurchDate PROMPT 'When was the car purcahsed?(ex. 13-FEB-06)'
ACCEPT p_PurchCost PROMPT 'How much did he car cost?'
ACCEPT p_ListPrice PROMPT 'What was the list price of the car?'


DECLARE
  n_numb number := 1;

BEGIN
  --WHILE  n_numb < 2 LOOP

  IF '&p_Options' = 'YES' THEN
  :g_options := 'Input will be added into the option table AND car table';
  -- Insert statement goes here
  n_numb := 2;

  ELSIF '&p_Options' = 'NO' THEN
  :g_options := 'Input will only be added to the car table';
  -- Insert statement goes here
  n_numb := 2;

  ELSE 
  :g_options := ' The correct input for the first prompt was "YES" or "NO", you entered something else'
  --:g_options :=  :g_options || ' The script will now end, please run it again'
  n_numb := 0;

  END IF;
  --END LOOP;
END;
/

ループアウトと n_numb 変数をコメントアウトしたところ、次のエラーが発生しました。

END IF;
  *
ERROR at line 22:
ORA-06550: line 22, column 7:
PLS-00103: Encountered the symbol "END" when expecting one of the following:
. ( * @ % & = - + ; < / > at in is mod remainder not rem
<an exponent (**)> <> or != or ~= >= <= <> and or like
between || multiset member SUBMULTISET_
The symbol ";" was substituted for "END" to continue.

更新 1:ステートメントの最後にセミコロンを追加しましたが、p_Options を宣言する必要があるというエラーが表示されました。p_Options を '&p_Options' に変更したところ、スクリプトが正常に実行されたと表示されましたが、そうではありませんでした。出力が表示されません。のように: 「スクリプトは終了します。もう一度実行してください」 .

これは私が見るすべてです!

old   7:       IF '&p_Options' = 'YES' THEN
new   7:       IF '' = 'YES' THEN
old  12:       ELSIF '&p_Options' = 'NO' THEN
new  12:       ELSIF '' = 'NO' THEN

PL/SQL procedure successfully completed.

更新 2: if ステートメントが機能するようになりました。しかし、入力として YES または NO 以外を入力すると、ループは機能しません。私は基本的にリターンを得られず、エンターを永遠に押し続けることができます。:S

------------別のメモ----------

ユーザーが入力した情報を抽出し、INSERT ステートメントを使用してテーブルに追加するにはどうすればよいですか?

4

1 に答える 1

0

少しデバッグを追加して、スクリプトを少し変更しました。そのまま動作しているようです:

SET VERIFY OFF
SET FEED OFF
SET SERVEROUTPUT ON
SET SERVEROUTPUT ON
VARIABLE g_options VARCHAR2(1000);
PROMPT 'Vehicle Inventory Record'
ACCEPT p_Options PROMPT 'Does this car has any Optional Equipment or Accessories?(YES or NO): ';
/*
-- Option table
ACCEPT p_OCode PROMPT 'Enter the code for the option picked (Ex. CD2):'
ACCEPT p_ODescription PROMPT 'Enter the description for the option picked:'
ACCEPT p_OPrice PROMPT 'Enter the price for the option picked:'
-- Car table
ACCEPT p_SerialNo PROMPT 'What is the serial number of the car?'
ACCEPT p_Make PROMPT 'What is the make of the car?'
ACCEPT p_Model PROMPT 'What is the model of the car?'
ACCEPT p_Year PROMPT 'What is the color of the car?'
ACCEPT p_Trim PROMPT 'What is the trim of the car?'
ACCEPT p_PurchFrom PROMPT 'Where was the car purchased from?'
ACCEPT p_PurchInvNo PROMPT 'What was the invoice number of the purcahse?'
ACCEPT p_PurchDate PROMPT 'When was the car purcahsed?(ex. 13-FEB-06)'
ACCEPT p_PurchCost PROMPT 'How much did he car cost?'
ACCEPT p_ListPrice PROMPT 'What was the list price of the car?'
*/

DECLARE
  n_numb number := 1;

BEGIN
  --WHILE  n_numb < 2 LOOP
  IF '&p_Options' = 'YES' THEN
  :g_options := 'Input will be added into the option table AND car table';
  -- Insert statement goes here
  dbms_output.put_line('insert with YES');
  n_numb := 2;

  ELSIF '&p_Options' = 'NO' THEN
  :g_options := 'Input will only be added to the car table';
  -- Insert statement goes here
  dbms_output.put_line('insert with NO');
  n_numb := 2;

  ELSE
  :g_options := ' The correct input for the first prompt was "YES" or "NO", you entered something else';
  --:g_options :=  :g_options || ' The script will now end, please run it again'
  dbms_output.put_line('ELSE');
  n_numb := 0;

  END IF;
  --END LOOP;
END;

さらに問題がある場合は、質問を更新して詳細を確認してください。

于 2012-08-13T01:20:50.650 に答える