2011-10-13 18 views
4

J'ai regardé tant de tutoriels sur le net, et je vois pas mal de questions similaires à regarder qui ne répondent pas à ma question puisqu'elles utilisent différentes implémentations SQL. J'utilise SQLPlus, oracle 10g.Quel est le problème avec ce code de procédure stockée SQL (Oracle) simple?

CREATE OR REPLACE PROCEDURE getuserid 
(uname in varchar) AS 
BEGIN 
select accountId from "ValidClients" 
where username = uname 
END getuserid; 

Le code 'SELECT accountId de "ValidClients" WHERE nom d'utilisateur =' testname '; 'fonctionne correctement, donc je ne peux pas comprendre ce que je fais de façon incorrecte pour que SQLPlus me donne une erreur de compilation.

EDIT: Aucune clause INTO n'était la réponse, merci à tous ceux qui ont aidé. Problème résolu d'une part, puis-je demander à confirmer: un programme Java va appeler ces procédures stockées et essayer de les stocker dans un ensemble de résultats. Le code suivant fonctionnera correctement pour la procédure stockée ci-dessus?

CallableStatement cs = connection.prepareCall("{call getuserid(?)}"); 
cs.setString(1, user); 
ResultSet rs = cs.executeQuery(); 

int userid = Integer.parseInt(rs.getString(1)); 

EDIT2: Ignore ce qui précède, il est conservé pour la postérité. Non seulement est-il assez grand pour une question qui lui est propre, mais il est facilement résolu par une recherche Google et ne nécessite pas de réponse personnalisée.

+0

Vous avez raison, je suppose que j'ai été assez impoli de ne pas le faire. Rectifié. – buggritall

Répondre

3

où mettez-vous le résultat de la requête? Si l'on suppose accountId est un numéro, vous pouvez essayer:

CREATE OR REPLACE PROCEDURE getuserid 
(uname_p in varchar, accountId_p out NUMBER) AS 
BEGIN 
select accountId into accountId_p from "ValidClients" 
where username = uname_p; 
END getuserid; 

Cordialement

+0

Tout le monde ici m'a répondu et cela m'a beaucoup aidé. Apparemment, mon conférencier et mon tuteur ont tous deux négligé l'importance de la clause INTO. – buggritall

+0

Veuillez noter qu'il s'agit d'une syntaxe PL * SQL et non d'une syntaxe SQL pure, donc en fonction de ce que parlaient votre tuteur et conférencier, ils auraient pu avoir raison. SQL * Plus gère à la fois PL * SQL et SQL. – BigMike

+2

Je serais toujours enclin à en faire une fonction si vous renvoyez un résultat plutôt qu'un paramètre OUT. En outre, vous devez ajouter au moins un handle d'exception pour les exceptions NO_DATA_FOUND. J'interrogerais votre tuteur et conférencier car la clause INTO est fondamentale pour la déclaration fonctionnant en PL/SQL. – Ollie

1

ajouter un point-virgule à la fin de la sélection et vous devez select into une variable

par exemple:

CREATE OR REPLACE PROCEDURE getuserid (uname in varchar) AS 
    v_account Number; 
BEGIN 
    SELECT accountId INTO v_account 
    FROM "ValidClients" 
    WHERE username = uname; 
END getuserid; 
1

Il devrait être:

CREATE OR REPLACE 
PROCEDURE getuserid (
    uname in varchar2 
) 
AS 
    v_account_id ValidClients.account_id%TYPE; 
BEGIN 
    select accountId 
    into v_account_id 
    from "ValidClients" 
    where username = uname; 
END getuserid; 

Vous pouvez considérer ce que vous allez faire avec la valeur que vous revenez. Soit faire un paramètre OUT ou mieux encore, si vous renvoyez une valeur, faites-en une FONCTION.

CREATE OR REPLACE 
FUNCTION getuserid (
    uname in varchar2 
) 
RETURN ValidClients.account_id%TYPE 
AS 
    v_account_id ValidClients.account_id%TYPE; 
BEGIN 
    select accountId 
    into v_account_id 
    from "ValidClients" 
    where username = uname; 

    RETURN v_account_id; 
EXCEPTION 
    WHEN no_data_found 
    THEN 
     -- Handle account ID not being present 
    WHEN others 
    THEN 
     -- Handle other errors. 
END getuserid;