web-dev-qa-db-ja.com

PL / SQL:プロシージャでユーザー入力を要求するにはどうすればよいですか?

これは、私が行っている大規模プロジェクトのごく一部についての質問です。私は以下を試しましたが、その下に2つのエラーが表示されます。

SET SERVEROUTPUT ON

CREATE OR REPLACE PROCEDURE HELLO AS
DECLARE
variable1 NUMBER(1);
variable2 CHAR(1);

BEGIN
DBMS_OUTPUT.PUT_LINE('Hello World');
variable1 := &please_enter_1_or_0;
variable2 := &please_enter_y_or_n;
END;
/

エラー(2,5):PLS-00103:次のいずれかが予期されているときに、記号「DECLARE」が発生しました:begin関数プラグマプロシージャサブタイプタイプ現在のカーソルが存在します以前の外部言語が削除されます。

エラー(10,8):PLS-00103:次のいずれかを予期しているときに、シンボル「ファイルの終わり」に遭遇しました:(ループモッドnullプラグマレイズリターンセレクトアップデート、
<<続行閉じる現在の削除フェッチロック
オープンロールバックセーブポイントセットSQL実行コミットを挿入して、すべてのマージパイプパージを実行します

コードがどのようにマークされるかについてのマークスキームが与えられました。このセクションでは、関連する基準は次のとおりです。「スクリプトはプロシージャを使用しますか?」および「スクリプトは正しい/間違った、チーム/個人を要求し、提供されたデータを正しく処理しますか?」.

プロジェクトの簡単な引用は、「正しい/間違った(&を使用して)プロンプトを表示してからテーブルを更新するプロシージャを開発する」(ここで、テーブルはテーブルの名前です)

変数の目的は、既存のレコード属性を更新することでした。つまり、ユーザーが1とnを選択した場合、レコードのnullを2に更新します。1とyの場合は1に更新し、0とy/nの場合は0に更新します。

4
user3120554

PL/SQLは、自律型プログラムを作成するための言語です。ユーザーの操作性を考慮して設計されていません。入力値はパラメーターとして渡されます。したがって、プログラムは次のようになります。

CREATE OR REPLACE PROCEDURE HELLO
    (p1 in number
      , p2 in varchar2)
AS
    l_salutation varchar2(20) := 'Hello World';
BEGIN
    DBMS_OUTPUT.PUT_LINE(l_salutation);
    DBMS_OUTPUT.PUT_LINE('p1 = ' || p1);
    DBMS_OUTPUT.PUT_LINE('p2 = ' || p2);
END;
/

名前付きプロシージャではDECLAREは必要ないことに注意してください。 ASとBEGINの間のセクションは、l_salutationで行ったように、変数を宣言するためのものです。

プログラムを呼び出すときに、これらのパラメーターの値を指定できます。 SQL * Plusでは、次のように機能します。

SET SERVEROUTPUT ON

accept p1 Prompt "please enter 1 or 0: "
accept p2 Prompt "please enter Y or N: "

exec HELLO (:p1, :p2)
6
APC

このコードはSQL * Plusでのみ機能し、ストアドプロシージャの作成には使用できません!!!

DECLARE
variable1 NUMBER(1);
variable2 CHAR(1);

BEGIN
DBMS_OUTPUT.PUT_LINE('Hello World');
variable1 := &please_enter_1_or_0;
variable2 := '&please_enter_y_or_n';
END;

PL/SQL構文で適切に受け入れられるように、最後の置換変数が文字列で引用されている最後のステートメントの違いに注意してください。とにかく、あなたの質問への最後のコメントでお伝えしたように、これはユーザーの操作ではなく、ステートメントの前処理の結果です。異なる値を入力するたびに、RDBMSは異なるソースコードを実行します。

おそらく「プロシージャ」を使用するという要件は、STOREDプロシージャを使用することを意味するものではありません(そうすることは不可能です)が、SQL * Plusスクリプトを意図しているだけなので、説明を求めてください。

2

PL/SQLプロシージャまたはパッケージでクライアントからメッセージを直接受信することはできません。

これをエミュレートするためにできる最善の方法は、テーブルデータとやり取りして、ユーザーにテーブルにデータを挿入してそれに反応させるか、アドバンストキューイングを使用することです(これはほとんど同じことです)。

または、プロシージャが呼び出されたときに、ユーザー入力をパラメーターとして受け入れます。

1
David Aldridge

そのoraエラーを修正するには、宣言を削除するだけです

0
Jeremy