2012-11-19 6 views
1

J'essaie de créer une procédure PL/SQL. Mais ça ne fonctionne pas correctement. S'il vous plaît, regardez le code et donnez des conseils à ce sujet.Erreur dans PL/SQL et SQL% ROWCOUNT

CREATE OR REPLACE PROCEDURE TEST IS 

DECLARE 
EMPLOYEENUM EMPLOYEE.E#%type; 
EMPLOYEENAME EMPLOYEE.NAME%type; 
NUMRECORDS NUMBER(2); 

BEGIN 

SELECT EMP.E# INTO EMPLOYEENUM ,EMP.NAME INTO EMPLOYEENAME 
FROM EMPLOYEE EMP 
WHERE EXISTS 
(SELECT * FROM MECHANIC, DRIVER 
WHERE EMP.E# = DRIVER.E# 
AND EMP.E# = MECHANIC.E#); 

SELECT COUNT(*) INTO NUMRECORDS 
FROM (
SELECT EMP.E#,EMP.NAME 
FROM EMPLOYEE EMP 
WHERE EXISTS 
(SELECT * FROM MECHANIC, DRIVER 
WHERE EMP.E# = DRIVER.E# 
AND EMP.E# = MECHANIC.E#)); 

IF (NUMRECORDS > 0) THEN 
    DBMS_OUTPUT.PUT_LINE('ERROR: CANNOT MAKE MORE THEN 2 TRIPS PER DAY'); 
    ROLLBACK; 
ELSE 
    COMMIT; 
END IF; 
EXCEPTION 
WHEN OTHERS THEN 
    DBMS_OUTPUT.PUT_LINE(SQLERRM); 
    ROLLBACK; 
END VERIFY; 

Et je suis sûr que je n'ai pas besoin de réexécuter le code pour voir le nombre de lignes. Je crois comprendre qu'il ya quelque chose appelé

SQL% ROWCOUNT

qui retourne le nombre de lignes. S'il vous plaît aviser comment l'utiliser.

+5

"ne fonctionne pas correctement" n'est PAS une information utile. Comment ça ne marche pas? mauvais résultats? Message d'erreur? donner un coup de pied à votre chien et voler votre argent de déjeuner? –

+0

Le premier SELECT peut être retiré. Il n'ajoute rien –

+0

directement après avoir fait votre select ou dml, faire quelque chose comme v_rows_affected: = SQL% ROWCOUNT; Voir ici: http://docs.oracle.com/cd/E11882_01/appdev.112/e17126/static.htm#CIHJJJDG – tbone

Répondre

1

Vous pouvez utiliser un IDE et compiler pour voir où il échoue. Si vous essayez de compiler ceci dans SQLPLUS et que vous voyez juste le message "compilé avec des erreurs", tapez SHOW ERRORS et vous verrez les erreurs. Je recommanderais quand même un IDE comme développeur SQL.

Voici quelques questions que je peux voir ....

  1. mot-clé Declare: Non nécessaire lorsque vous créez une procédure ou une fonction
  2. Votre nom a créer de procédure « TEST » et votre fin a "VERIFIER"
  3. SELECT EMP.E# INTO EMPLOYEENUM ,EMP.NAME INTO EMPLOYEENAME: vous devez d'abord lister toutes les colonnes, puis les noms des variables. Vous ne savez pas ce que vous faites, puisqu'il n'y a pas de DML ici, mais si votre plan est d'appeler cette procédure à partir d'un déclencheur, vous pouvez frapper l'erreur de table de mutation si l'insertion est dans Mechanic ou Driver.

Plus d'arrière-plan et plus d'informations d'erreur seraient utiles.

+0

J'ai besoin de créer une procédure qui montre le nom et l'identifiant des personnes qui sont employées comme conducteur et mécanicien. S'il y a que doit dire qui sont-ils. si je n'ai pas que je dois dire ok – user1835958

+0

J'ai enregistré le fichier dans un fichier .sql et j'excute le sql et il s'arrête et le curseur clignote – user1835958

+0

Vous devriez avoir un "/" ou un point-virgule à la fin du script pour qu'il soit courir. Ou tapez "/" puis "Entrée". –

0

Il y a quelques problèmes ...

    mot-clé
  1. DECLARE est pas nécessaire d'utiliser dans la procédure ou la fonction.
  2. Nom de procédure a commencé comme « TEST » et à la fin est « VÉRIFIER »
  3. Vous avez utilisé « SELECT EMP.E # EN EMPLOYEENUM, EMP.NAME EN EmployeeName », vous devez utiliser toutes les colonnes d'abord, puis les noms de variables. Il doit être SELECT EMP.E #, EMP.NAME IN EMPLOYEENUM, EMPLOYEENAME
  4. Vous n'avez pas utilisé de DML entre la procédure et vous utilisez ROLLBACK, son non d'utilisation.

Si vous pouvez fournir la structure de table « Mécanicien » et « pilote », alors je peux vous envoyer le code qui peut vous aider.

Merci.