1
votes

Impossible de faire fonctionner une instruction SELECT dans le sous-programme

J'essaie de créer un sous-programme qui prendra un code postal d'entrée, puis invitera l'utilisateur à entrer un nouveau code postal qui mettra ensuite à jour la base de données. Si le code postal qui n'est pas dans la base de données, il affichera un message. Quelque chose ne fonctionne pas avec l'instruction select

67226   Wichita
60606   Fort Dodge
50302   Kansas City
54444   Columbia
66002   Liberal
61111   Fort Hays

Si le code postal correspond à ce qui est dans la base de données, il devrait alors afficher `` la sélection fonctionne ''

si le code postal le fait ne correspond pas, il doit afficher "ce zip n'est pas dans la base de données"

données de la table:

SET SERVEROUTPUT ON;
ACCEPT p_find_zip PROMPT 'Please enter a 5 digit zip code:'

DECLARE
  find_zip char(5) :=&p_find_zip;
  v_zip  char(5);
BEGIN
  SELECT zip
    INTO v_zip
  FROM zipcodes
  WHERE find_zip = v_zip;

  if find_zip = v_zip then
    DBMS_OUTPUT.PUT_LINE('the select is working');
  end if;
EXCEPTION WHEN NO_DATA_FOUND THEN
  DBMS_OUTPUT.PUT_LINE('THAT ZIP IS NOT IN THE DATABASE');
END;
/


0 commentaires

3 Réponses :


0
votes

En supposant que votre colonne zip dans la table des codes zip s'appelle zip , votre requête devrait être comme ci-dessous:

SELECT zip
INTO v_zip
FROM zipcodes
WHERE zip = find_zip;

La condition find_zip = v_zip strong > ne vous rendra rien.

La condition si find_zip = v_zip alors est redondante car votre NO_DATA_FOUND sera de toute façon déclenché, donc vous afficherez toujours "la sélection fonctionne" lorsque les données est trouvé uniquement.


3 commentaires

Cela m'a renvoyé une erreur selon laquelle le ZIP doit être déclaré. Zip est le nom de colonne de la table des codes postaux


Là où zip = find_zip fonctionne, problème résolu. Si le problème de déclaration qui vous préoccupait ne se produit pas. Merci pour votre aide.


Eh bien, si cela a aidé, je m'attendrais à ce que vous acceptiez ma réponse :)



0
votes

cela fonctionnera:

create table NS_zipcodes3(zipcode varchar(5),city varchar(20));

insert into NS_zipcodes3 values('67226','Wichita');
insert into NS_zipcodes3 values('60606' ,  'Fort Dodge');
insert into NS_zipcodes3 values('50302'  , 'Kansas City');
insert into NS_zipcodes3 values('54444' ,  'Columbia');
insert into NS_zipcodes3 values('66002',  'Liberal');
insert into NS_zipcodes3 values('61111' ,  'Fort Hays');
select * from NS_zipcodes3;


SET SERVEROUTPUT ON;

 DECLARE
  find_zip varchar(10);
  v_zip  varchar(5);
BEGIN

    DBMS_OUTPUT.PUT_LINE('please enter a 5 digit zipcode') ;
    select :p_find_zip into find_zip from dual;
  SELECT zipcode
    INTO v_zip
  FROM NS_zipcodes
  WHERE zipcode = find_zip;

  if to_number(find_zip) =to_number(v_zip) then
     DBMS_OUTPUT.PUT_LINE('the select is working');
  end if;

EXCEPTION WHEN no_data_found THEN
  DBMS_OUTPUT.PUT_LINE('THAT ZIP IS NOT IN THE DATABASE');
WHEN others THEN
  DBMS_OUTPUT.PUT_LINE('invalid zipcode entered');

END;
/


0 commentaires

0
votes

si vous voulez vérifier si le code postal existe dans votre tableau, vous pouvez faire quelque chose comme ci-dessous:

sélectionnez count (1) dans v_zip à partir des codes postaux où maintenance_seq_no = find_zip;

si v_zip <> 0 alors

dbms_output.put_line ('Le code postal existe');

autre

dbms_output.put_line ('Le code postal n'existe pas');

end if;


0 commentaires