Question

Je suis nouveau à oracle. Lorsque je crée une procédure stockée à l'aide:

CREATE OR REPLACE PROCEDURE PROCEDURE1 
AS
BEGIN

  SELECT FIRSTNAME,
         LASTNAME
    INTO FirstName,LastName
    FROM EMPLOYEE;

END PROCEDURE1;

i obtenir les erreurs suivantes:

  

PL / SQL Déclaration Ignoré    Identifier PRENOM doit être déclarée    ORA-00904 identificateur invalide

Était-ce utile?

La solution


Je pense que le mot-clé « AS » ne fonctionnera pas. Si cela ne fonctionne pas, utilisez « IS ».
Le repos sont très bien et très bons conseils.

Si vous avez besoin d'aide concernant PL / SQL, vous pouvez jeter un oeil à ce lien. Il est très simple et facile à comprendre;
http://plsql-tutorial.com/

Ceci est ma solution à l'erreur que vous obtenez;

CREATE OR REPLACE PROCEDURE PROCEDURE1 IS
  v_FIRSTNAME EMPLOYEE.FIRSTNAME%TYPE;
  v_LASTNAME EMPLOYEE.LASTNAME%TYPE;
  CURSOR EMPCURSOR IS
  SELECT FIRSTNAME, LASTNAME FROM EMPLOYEE;      
  BEGIN   
     IF NOT EMPCURSOR%ISOPEN THEN
         OPEN EMPCURSOR;
     END IF;
     LOOP
        FETCH EMPCURSOR INTO V_FIRSTNAME,V_LASTNAME;
        EXIT WHEN EMPCURSOR%NOTFOUND;
     END LOOP;
     IF EMPCURSOR%ISOPEN THEN
        CLOSE EMPCURSOR;
     END;
  END PROCEDURE1;

Vous pouvez également utiliser DBMS_OUTPUT.PUT_LINE(V_FIRSTNAME || ','|| V_LASTNAME), dans la boucle pour afficher la sortie. mais pour ce faire, vous devez d'abord exécuter la commande server output on

Autres conseils

Vous devez déclarer des variables avant de tenter de les remplir:

CREATE OR REPLACE PROCEDURE PROCEDURE1 
AS

 FirstName EMPLOYEE.FIRSTNAME%TYPE;
 LastName EMPLOYEE.LASTNAME%TYPE;

BEGIN

  SELECT FIRSTNAME,
         LASTNAME
    INTO FirstName,LastName
    FROM EMPLOYEE;

END PROCEDURE1;

La notation% TYPE est un raccourci pour la déclaration de type de données qui correspond au type de données de la colonne. Si ce type de données ne change jamais, vous n'avez pas besoin de mettre à jour la procédure.

Vous devez déclarer les variables.

CREATE OR REPLACE
PROCEDURE PROCEDURE1 AS
 V_FIRSTNAME VARCHAR2(60);
 V_LASTNAME  VARCHAR2(60);
BEGIN
        SELECT FIRSTNAME,LASTNAME
         INTO V_FIRSTNAME ,V_LASTNAME  
         FROM EMPLOYEE;
END PROCEDURE1;

En réponse à votre commentaire, des instructions SQL dans le bloc PL / SQL ne peuvent extraire que 1 enregistrement. Si vous avez besoin d'aller chercher plusieurs enregistrements, vous devez stocker les enregistrements dans un curseur et les traiter.

CREATE OR REPLACE
    PROCEDURE PROCEDURE1 AS

     CURSOR EMP_CUR IS
         SELECT FIRSTNAME,LASTNAME
         FROM EMPLOYEE;
    EMP_CUR_REC EMP_CUR%ROWTYPE;

    BEGIN
     FOR EMP_CUR_REC IN EMP_CUR LOOP
         -- do your processing
         DBMS_OUTPUT.PUT_LINE('Employee first name is ' || EMP_CUR_REC.FIRSTNAME);
         DBMS_OUTPUT.PUT_LINE('Employee last name is ' || EMP_CUR_REC.LASTNAME);
    END LOOP;
    END PROCEDURE1;

Pour expliquer:    EMP_CUR détient l'instruction SQL à exécuter.    EMP_CUR_REC détient les documents qui seront récupérés par l'instruction SQL.     %ROWTYPE indique que l'enregistrement sera du même type de données que la ligne qui contient les données

Le FOR LOOP va chercher chaque enregistrement, et vous pouvez faire tout ce que le traitement à faire.

Dans une réponse à @ la réponse de Sathya ci-dessus @kayak demandé: « Puis-je avoir quelque chose comme Select * from Tablename ou prenom sélectionner, de tablename lastname, comme nous avons dans le serveur sql ».

Oui, vous pouvez le faire, mais vous devrez soit d'inclure une clause WHERE ou utiliser un curseur. Si vous incluez une clause WHERE qui limite vos résultats à une seule ligne, vous pouvez écrire quelque chose comme

CREATE OR REPLACE PROCEDURE PROCEDURE1
IS
  rowEmployees EMPLOYEE%ROWTYPE;
BEGIN
  SELECT *
    INTO rowEmployees
    FROM EMPLOYEE
    WHERE EMPLOYEE_ID = 12345;
END PROCEDURE1; 

Par contre, si vous ne soit pas une clause WHERE parce que vous souhaitez traiter toutes les lignes de la table, ou si vous avez une clause WHERE qui ne limite pas vos résultats à une seule ligne, vous pouvez utiliser un curseur de la manière suivante:

CREATE OR REPLACE PROCEDURE PROCEDURE1 IS
BEGIN
  FOR rowEmployees IN (SELECT *
                         FROM EMPLOYEE
                         WHERE EMPLOYEE_ID IN (12345, 67890, 111213, 141516))
  LOOP
    <do something with rowEmployees here>
  END LOOP;
END PROCEDURE1; 

Partager et apprécier.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top