Avatar billede thomas_j Nybegynder
18. februar 2010 - 23:30 Der er 2 kommentarer og
1 løsning

Stored procedure return value

Hvis jeg har en stored procedure med 2 select sætninger i, returne SP værdien fra min første select istedet for den sidste.

Er der en metode til at bestemme hvilken retur værdi som den skal sende

F.eks ved nedenstående SP

CREATE DEFINER=`root`@`%` PROCEDURE `userLogin`(
_username varchar(50),
_password varchar(50),
_site varchar(15))
BEGIN

declare lstatus int default 0;

    SELECT count(usersId) as _loginCnt
    FROM user
    WHERE username = _username and password = _password;

IF _loginCnt=1 THEN
    BEGIN
       
        SELECT usersid FROM intranet.view_login
        WHERE username = _username and password = _password;
   
        SELECT count(usersId) as groupCnt FROM grupper
        WHERE usersID = usersid AND GroupName = _site ;
       
        IF groupCnt=1 THEN
            SET lstatus = 1;
        ELSE
            SET lstatus = 4;
        END IF;
       
    END;
ELSEIF _loginCnt = 0 THEN
    SET lstatus = 0;
ELSE
    SET lstatus = 2;
END IF;


END//

Den returner _loginCnt, hvor jeg gerne vil have den sende lstatus tilbage til mig.

Kan dette lade sig gøre
Avatar billede arne_v Ekspert
19. februar 2010 - 02:18 #1
Du kan godt returnere flere result sets fra en SP.

Eksempel:

DELIMITER //
CREATE PROCEDURE test(OUT v INTEGER)
BEGIN
    -- first result set
    SELECT 1;
    -- second result set
    SELECT 2;
    -- out parameter
    SELECT 3 INTO v;
END//
DELIMITER ;

Kald fra Java:

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Types;

public class MySP {
    public static void main(String[] args) throws Exception {
        Class.forName("com.mysql.jdbc.Driver");
        Connection con = DriverManager.getConnection("jdbc:mysql://localhost/Test", "root", "");
        CallableStatement cstmt = con.prepareCall("{CALL test(?)}");
        cstmt.registerOutParameter(1, Types.INTEGER);
        cstmt.execute();
        ResultSet rs = cstmt.getResultSet();
        while(rs.next()) {
            System.out.println(rs.getInt(1));
        }
        cstmt.getMoreResults();
        rs = cstmt.getResultSet();
        while(rs.next()) {
            System.out.println(rs.getInt(1));
        }
        System.out.println(cstmt.getInt(1));
        cstmt.close();
        con.close();
    }
}

Output:

1
2
3
Avatar billede thomas_j Nybegynder
28. februar 2010 - 22:53 #2
Jepski - det var det... (har lige glemt at skrive tilbage - det beklager jeg)

Smid lige et svar så får du pointene..
Avatar billede arne_v Ekspert
28. februar 2010 - 22:57 #3
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester