Question de base Oracle
-
30-09-2019 - |
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
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.