it-swarm.com.de

PL/SQL: Wie fordere ich die Benutzereingabe in einer Prozedur auf?

Dies ist eine Frage zu einem kleinen Teil eines großen Projekts, das ich gerade mache. Ich habe Folgendes versucht, aber ich bekomme nur die zwei Fehler darunter:

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

Fehler (2,5): PLS-00103: Das Symbol "DECLARE" ist aufgetreten, wenn Folgendes erwartet wird: begin function Pragma procedure subtype type current cursor delete exists before external language Das Symbol "begin" wurde ersetzt, um "DECLARE" fortzusetzen .

Fehler (10,8): PLS-00103: Das Symbol "Dateiende" wurde gefunden, wenn Folgendes erwartet wurde: (begin case declarate end exception exit für goto if loop mod null Pragma Raise Return Select Update, während mit
<< weiter aktuelle Löschsperre schließen
open rollback savepoint set einfügen sql commit ausführen für alle Merge-Pipe-Bereinigungen

Wir erhielten ein Markierungsschema dafür, wie unser Code markiert werden würde, und für diesen Abschnitt lauten die relevanten Kriterien: "Verwendet das Skript eine Prozedur?" und "Fordert das Skript zur Eingabe von Richtig/Falsch und Team/Person auf und verarbeitet die bereitgestellten Daten richtig?".

Die Projektbeschreibung zitiert "Entwickeln Sie eine Prozedur, die zur Eingabe von RECHTS/FALSCH auffordert (mit &) und anschließend die Tabelle aktualisiert" (wobei table der Name einer Tabelle ist)

Der Zweck der Variablen bestand darin, ein vorhandenes Datensatzattribut zu aktualisieren. wenn der Benutzer 1 und n gewählt hat, dann aktualisiere die Null in dem Datensatz auf 2. wenn es 1 war und y dann aktualisiere auf 1, und wenn 0 und y/n dann aktualisiere auf 0

3
user3120554

PL/SQL ist eine Sprache zum Schreiben autonomer Programme. Es ist nicht für Benutzerinteraktivität ausgelegt. Eingabewerte werden als Parameter übergeben. Ihr Programm sollte also so aussehen

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

Beachten Sie, dass DECLARE mit einer benannten Prozedur nicht erforderlich ist. Der Abschnitt zwischen AS und BEGIN dient zum Deklarieren von Variablen, wie ich es mit l_salutation getan habe.

Sie können Werte für diese Parameter angeben, wenn Sie das Programm aufrufen. In SQL * Plus würde es so funktionieren:

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

Dieser Code funktioniert nur in SQL * Plus und kann nicht zur Erstellung einer gespeicherten Prozedur verwendet werden !!!

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;

Beachten Sie den Unterschied in der letzten Anweisung, in der die letzte Substitutionsvariable in einer Zeichenfolge in Anführungszeichen steht, damit sie von der PL/SQL-Syntax ordnungsgemäß akzeptiert wird. Wie ich Ihnen im letzten Kommentar zu Ihrer Frage gesagt habe, handelt es sich jedoch nicht um eine Benutzerinteraktion, sondern nur um das Ergebnis einer Anweisungsvorverarbeitung. Jedes Mal, wenn Sie andere Werte eingeben, führt das RDBMS einen anderen Quellcode aus.

Wahrscheinlich bedeutet Ihre Anforderung, eine "Prozedur" zu verwenden, nicht die Verwendung einer STORED-Prozedur (das ist nicht möglich), sondern es wurde lediglich ein SQL * Plus-Skript vorgesehen, das nach Klarstellungen fragt.

1

Sie können Nachrichten in einer PL/SQL-Prozedur oder einem Paket nicht direkt vom Client empfangen.

Um dies zu emulieren, können Sie am besten eine Schnittstelle mit Tabellendaten erstellen, und die Benutzer müssen Daten in die Tabelle einfügen und darauf reagieren oder Advanced Queuing verwenden (was in etwa derselbe entspricht).

Akzeptieren Sie alternativ die Benutzereingabe als Parameter, wenn die Prozedur aufgerufen wird.

1
David Aldridge

Sie können einfach die Deklaration entfernen, um diesen Fehler zu beheben

0
Jeremy