web-dev-qa-db-fra.com

PL/SQL: comment inviter l'utilisateur dans une procédure?

C'est une question sur une petite partie d'un grand projet que je fais. J'ai essayé ce qui suit mais je viens de recevoir les deux erreurs en dessous:

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

Error (2,5): PLS-00103: Le symbole "DECLARE" est rencontré lorsque l'une des actions suivantes est attendue: begin fonction pragma procédure type type curseur actuel effacer existe avant le langage externe Le symbole "begin" a été remplacé par "DECLARE" .

Error (10,8): PLS-00103: Le symbole "fin de fichier" est rencontré lorsque l'un des éléments suivants est attendu: (begin case declare end end exception exit pour goto if loop mod null pragma raise return
<< continuer fermer effacer effacer verrouiller
insert open rollback savepoint set sql execute commit pour toutes les purges de fusion

Nous avons reçu un barème de notation de la manière dont notre code serait marqué. Pour cette section, les critères pertinents seraient: "Le script utilise-t-il une procédure?" et "Le script invite-t-il les bons/mauvais et les équipes/individus et gère-t-il correctement les données fournies?".

Le résumé du projet cite "Développer une procédure qui invite RIGHT/WRONG (using &), puis met à jour table" (table étant le nom d'une table

Le but des variables était de mettre à jour un attribut d'enregistrement existant. c'est-à-dire si l'utilisateur choisit 1 et n, met à jour le null de l'enregistrement à 2. S'il s'agit de 1 et y, met à jour à 1, et si 0 et y/n, met à jour à 0

3
user3120554

PL/SQL est un langage pour écrire des programmes autonomes. Il n'est pas conçu pour l'interactivité de l'utilisateur. Les valeurs d’entrée sont transmises sous forme de paramètres. Votre programme devrait donc ressembler à ceci

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

Notez qu'il n'est pas nécessaire de déclarer avec une procédure nommée. La section entre AS et BEGIN sert à la déclaration de variables, comme je l'ai fait avec l_salutation.

Vous pouvez fournir des valeurs pour ces paramètres lors de l'appel du programme. En SQL * Plus, cela fonctionnerait comme ceci:

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

Ce morceau de code ne fonctionne que dans SQL * Plus et ne peut pas être utilisé pour produire une procédure stockée !!!

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;

Attention à la différence dans la dernière instruction où la dernière variable de substitution est citée dans une chaîne pour être correctement acceptée par la syntaxe PL/SQL. Quoi qu'il en soit, comme je vous l'ai dit dans le dernier commentaire de votre question, il ne s'agit pas d'une interaction utilisateur, mais simplement du résultat d'un prétraitement d'une instruction. Chaque fois que vous entrez des valeurs différentes, le SGBDR exécute un code source différent.

Probablement, votre exigence d'utiliser une "procédure" ne signifie pas utiliser une procédure STORED (impossible à faire), mais ils voulaient simplement un script SQL * Plus, demandez des éclaircissements.

1
Alessandro Rossi

Vous ne pouvez pas recevoir directement de messages du client dans une procédure ou un package PL/SQL.

Le mieux que vous puissiez faire pour émuler cela est d'interagir avec les données de table et de permettre aux utilisateurs d'insérer des données dans la table et de réagir à cela, ou d'utiliser Advanced Queuing (ce qui revient à peu près à la même chose).

Vous pouvez également accepter les entrées utilisateur en tant que paramètres lors de l'appel de la procédure.

1
David Aldridge

Vous pouvez simplement supprimer le déclarer pour remédier à cette erreur

0
Jeremy