Problemas com acesso a dados atraves de stored procedures do oracle

7 respostas
N

Olá! Estou a ter problemas com a obtenção de dados de um base de dados

O codigo que estou a utlizar é:

import java.sql.*;
/**
 *
 * @author Nothunt
 */
public class Main {
    
    /** Creates a new instance of Main */
    public Main() {
    }
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
       java.sql.Connection conn = null;
        String xt;
        Statement st;
        String i="1";
        String tipo = "0";
        String user ="user";
        String pass = "pass";
        String nome = "nome";
        String apel = "apel";
        int typeuser=1;
        int userid=0;
        String userna= "Nothunt";
        String pass1="291782989";
        
        
        try {
            
            
            
            Class.forName("oracle.jdbc.driver.OracleDriver");
                conn = DriverManager.getConnection("jdbc:oracle:thin:@RAGE:1521:NOPROBLE","Nothunt","a291782989");
            CallableStatement cs3 = conn.prepareCall("{call AUTENTICA_UTILIZADOR1(?,?,?,?,?,?,?,?)}");
            cs3.setString(1,userna);
            cs3.setString(2,pass1);
           cs3.setString(3,i);
            cs3.setString(4,tipo);
            cs3.setString(5,user);
            cs3.setString(6,pass);
            cs3.setString(7,nome);
            cs3.setString(8,apel);
            
            cs3.execute();
            cs3.registerOutParameter(3,Types.VARCHAR);
            cs3.registerOutParameter(4,Types.VARCHAR);
            cs3.registerOutParameter(5,Types.VARCHAR);
            cs3.registerOutParameter(6,Types.VARCHAR);
            cs3.registerOutParameter(7,Types.VARCHAR);
            cs3.registerOutParameter(8,Types.VARCHAR);
            
            ResultSet rs3 = cs3.executeQuery();
            
            //user = rs3.getString(4);
            typeuser=(int)cs3.getInt(2);
            userid=(int)cs3.getInt(3);
            user = (String) cs3.getObject(4);
            pass = (String) cs3.getObject(5);
            nome = (String) cs3.getObject(6);
            apel = (String) cs3.getObject(7);
            
            System.out.println("resultado-1: "+typeuser);
            System.out.println("resultado0: "+userid);
            System.out.println("resultado1: "+user);
            System.out.println("resultado2: "+pass);
            System.out.println("resultado3: "+nome);
            System.out.println("resultado4: "+apel);
           while(rs3.next()) {
                tipo = rs3.getString(2);
                user = rs3.getString(3);
                pass = rs3.getString(4);
                nome = rs3.getString(5);
                apel = rs3.getString(6);
                System.out.print("tipo: "+tipo);
                System.out.print("user: "+user);
                System.out.print("pass: "+pass);
                System.out.print("nome: "+nome);
                System.out.print("apel: "+apel);
            }
            
            conn.close();

       }
        
        catch(Exception e){System.out.println(e.getClass().getName() + ": " + e.getMessage());} // TODO code application logic here
     // TODO code application logic here
    }
    
}

para o procedimento:

PROCEDURE AUTENTICA_UTILIZADOR1
(
 AUTVARINUSERNAME 	IN  UTILIZADORES.USERNAME%TYPE,
 AUTVARINPASSWORD 	IN  UTILIZADORES.PASSWORD%TYPE,
 AUTVAROUTIDUTILIZADOR	OUT UTILIZADORES.ID_UTILIZADOR%TYPE,
 AUTVAROUTIDTUTILIZADOR  OUT UTILIZADORES.ID_TIPO_UTILIZADOR%TYPE,
 AUTVAROUTUSERNAME       OUT UTILIZADORES.USERNAME%TYPE,
 AUTVAROUTPASSWORD       OUT UTILIZADORES.PASSWORD%TYPE,
 AUTVAROUTNOUTILIZADOR   OUT UTILIZADORES.NOME_UTILIZADOR%TYPE,
 AUTVAROUTAPUTILIZADOR   OUT UTILIZADORES.APELIDO_UTILIZADOR%TYPE

)
AS
BEGIN
SELECT     UTILIZADORES.ID_UTILIZADOR,
           UTILIZADORES.ID_TIPO_UTILIZADOR,
           UTILIZADORES.USERNAME,
           UTILIZADORES.PASSWORD,
           UTILIZADORES.NOME_UTILIZADOR,
           UTILIZADORES.APELIDO_UTILIZADOR
INTO   
            AUTVAROUTIDUTILIZADOR,
            AUTVAROUTIDTUTILIZADOR,
            AUTVAROUTUSERNAME,
            AUTVAROUTPASSWORD,
            AUTVAROUTNOUTILIZADOR,
            AUTVAROUTAPUTILIZADOR       
           
           
           
FROM UTILIZADORES
WHERE AUTVARINUSERNAME = USERNAME AND
      AUTVARINPASSWORD = PASSWORD;
END;

como resultado obtenho:

" avairaiveis de saida não foram declaradas"

podem ajudar-me?

sem mais os melhores cumprimentos

7 Respostas

jaboot

Vê se isso te ajuda:

http://www.guj.com.br/posts/list/36103.java#191716

N

olá novamente, obrigado pela dica!

alterei o codigo para:

package javaapplication5;
import java.sql.*;
import oracle.jdbc.OracleTypes;
/**
 *
 * @author Nothunt
 */
public class Main {
    
    /** Creates a new instance of Main */
    public Main() {
    }
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
     java.sql.Connection conn = null;
        String xt;
        Statement st;
        String i=":i";
        String tipo = ":tipo";
        String user =":user";
        String pass = ":pass";
        String nome = ":nome";
        String apel = ":apel";
        int typeuser=1;
        int userid=0;
        String userna= "Nothunt";
        String pass1="291782989";
        
        
        try {
            
            
            
            Class.forName("oracle.jdbc.driver.OracleDriver");
                conn = DriverManager.getConnection("jdbc:oracle:thin:@RAGE:1521:NOPROBLE","Nothunt","a1234");
            CallableStatement cs3 = conn.prepareCall("{call AUTENTICA_UTILIZADOR1(?,?,?,?,?,?,?,?)}");
            cs3.setString(1,userna);
            cs3.setString(2,pass1);
            cs3.setString(3,i);
            cs3.setString(4,tipo);
            cs3.setString(5,user);
            cs3.setString(6,pass);
            cs3.setString(7,nome);
            cs3.setString(8,apel);
            
            cs3.execute();
            cs3.registerOutParameter(3,OracleTypes.VARCHAR);
            cs3.registerOutParameter(4,OracleTypes.VARCHAR);
            cs3.registerOutParameter(5,OracleTypes.VARCHAR);
            cs3.registerOutParameter(6,OracleTypes.VARCHAR);
            cs3.registerOutParameter(7,OracleTypes.VARCHAR);
            cs3.registerOutParameter(8,OracleTypes.VARCHAR);
            
            ResultSet rs3 = cs3.executeQuery();
            
            //user = rs3.getString(4);
            typeuser=(int)cs3.getInt(2);
            userid=(int)cs3.getInt(3);
            user = (String) cs3.getObject(4);
            pass = (String) cs3.getObject(5);
            nome = (String) cs3.getObject(6);
            apel = (String) cs3.getObject(7);
            
            System.out.println("resultado-1: "+typeuser);
            System.out.println("resultado0: "+userid);
            System.out.println("resultado1: "+user);
            System.out.println("resultado2: "+pass);
            System.out.println("resultado3: "+nome);
            System.out.println("resultado4: "+apel);
           /*while(rs3.next()) {
                tipo = rs3.getString(2);
                user = rs3.getString(3);
                pass = rs3.getString(4);
                nome = rs3.getString(5);
                apel = rs3.getString(6);
                System.out.print("tipo: "+tipo);
                System.out.print("user: "+user);
                System.out.print("pass: "+pass);
                System.out.print("nome: "+nome);
                System.out.print("apel: "+apel);
            }*/
            
            conn.close();

       }
        
        catch(Exception e){System.out.println(e.getClass().getName() + ": " + e.getMessage());} // TODO code application logic here
     // TODO code application logic here   // TODO code application logic here
    }
    
}

Infelizmente o resultado foi:

run-single:

java.sql.SQLException: ORA-01403: não foram encontrados dados

ORA-06512: na "NOTHUNT.AUTENTICA_UTILIZADOR1", linha 15

ORA-06512: na linha 1
T
cs3.setString(1,userna);
             cs3.setString(2,pass1);
             cs3.setString(3,i);
             cs3.setString(4,tipo);
             cs3.setString(5,user);
             cs3.setString(6,pass);
             cs3.setString(7,nome);
             cs3.setString(8,apel);
             
             cs3.execute();
             cs3.registerOutParameter(3,OracleTypes.VARCHAR);
             cs3.registerOutParameter(4,OracleTypes.VARCHAR);
             cs3.registerOutParameter(5,OracleTypes.VARCHAR);
             cs3.registerOutParameter(6,OracleTypes.VARCHAR);
             cs3.registerOutParameter(7,OracleTypes.VARCHAR);
             cs3.registerOutParameter(8,OracleTypes.VARCHAR);

Só vou fazer uma perguntinha. Por que é que se chama “execute” primeiro e depois “registerOutParameter”? Não seria ao contrário?

N

olá novamente!

bem na verdade, thingol, podes ter razão assim, alterei o codigo para o seguinte:

import java.sql.*;
import oracle.jdbc.OracleTypes;
/**
 *
 * @author Nothunt
 */
public class Main {
    
    /** Creates a new instance of Main */
    public Main() {
    }
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
     java.sql.Connection conn = null;
        String xt;
        Statement st;
        String i="i";
        String tipo = "tipo";
        String user ="user";
        String pass = "pass";
        String nome = "nome";
        String apel = "apel";
        int typeuser=1;
        int userid=0;
        String userna= "Nothunt";
        String pass1="291782989";
        
        
        try {
            
            
            
            Class.forName("oracle.jdbc.driver.OracleDriver");
            conn = DriverManager.getConnection("jdbc:oracle:thin:@RAGE:1521:NOPROBLE","Nothunt","a1234");
            CallableStatement cs3 = conn.prepareCall("{call AUTENTICA_UTILIZADOR1(?,?,?,?,?,?,?,?)}");
            cs3.setString(1,userna);
            cs3.setString(2,pass1);
           
            
            
            cs3.registerOutParameter(3,OracleTypes.NUMERIC);
            cs3.registerOutParameter(4,OracleTypes.NUMERIC);
            cs3.registerOutParameter(5,OracleTypes.VARCHAR);
            cs3.registerOutParameter(6,OracleTypes.VARCHAR);
            cs3.registerOutParameter(7,OracleTypes.VARCHAR);
            cs3.registerOutParameter(8,OracleTypes.VARCHAR);
            cs3.execute();
           
            typeuser=(int)cs3.getInt(3);
            userid=(int)cs3.getInt(4);
            user = (String) cs3.getObject(5);
            pass = (String) cs3.getObject(6);
            nome = (String) cs3.getObject(7);
            apel = (String) cs3.getObject(8);
            
            System.out.println("resultado-1: "+typeuser);
            System.out.println("resultado0: "+userid);
            System.out.println("resultado1: "+user);
            System.out.println("resultado2: "+pass);
            System.out.println("resultado3: "+nome);
            System.out.println("resultado4: "+apel);
         
            
            conn.close();

       }
        
        catch(Exception e){System.out.println(e.getClass().getName() + ": " + e.getMessage());} // TODO code application logic here
     // TODO code application logic here   // TODO code application logic here
    }
    
}

infelizmente obtive o mesmo resultado:

java.sql.SQLException: ORA-01403: não foram encontrados dados

ORA-06512: na "NOTHUNT.AUTENTICA_UTILIZADOR1", linha 15

ORA-06512: na linha 1
jaboot

Bom, utilizando o Google:

ORA-01403 - No data found

O erro ORA-01403 é um erro relacionado ao SELECT dentro de uma
rotina PL/SQL.
Esse erro ocorre quando um SELECT não retorna nenhuma linha.
Por exemplo: 
...
SELECT nome
into v_nome
FROM empregados
WHERE num = -1;
...

esse comando não retornou nada, pois não existe empregado -1,logo
ocorreu o erro.
Fonte: [url]http://www.fontesbrasil.com/dicas_oracle.htm[/url] E aqui também:
Oracle/PLSQL: ORA-01403 Error
Error: 	ORA-01403: no data found
Cause: 	You tried one of the following:

   1. You executed a SELECT INTO statement and no rows were returned.
   2. You referenced an uninitialized row in a table.
   3. You read past the end of file with the UTL_FILE package.

Action: 	The options to resolve this Oracle error are:

   1. Terminate processing of the data.
Fonte: [url]http://www.techonthenet.com/oracle/errors/ora01403.php[/url]

Ou seja, você está fazendo um SELECT INTO e não está retornando nada. Como você setou uma variável para receber um dado e não veio nada, ele dá esse pau. [color=blue]O que você pode que fazer[/color] é tratar isso dentro de uma Exception na sua procedure, [color=blue]ou[/color] fazer uma gambiarra de contar quantos registros vieram, através de um COUNT().

Mas isso foi legal, eu trabalho com Oracle e também não sabia! Abraços!

J

Vou lhe passar uma dica. Pra qualquer procedure de banco você cria um parâmetro de saída (OUT) que retornará uma mensagem de erro caso aconteça algum. Segue exemplo

create or replace procedure teste (codEmpresa in empresa.cod_empresa%type, dscEmpresa out empresa.dsc_empresa%type, dscErro out varchar2) is

begin
  dscErro:= null;
  select
    dsc_empresa
  into
    dscEmpresa
  from
    empresa
  where
    cod_empresa = codEmpresa;  
exception
  when no_data_found then
     dscErro:= 'Nenhuma informação encontrada para o parâmetro informado';
  when too_many_rows then
     dscErro:= 'Mais de uma empresa foi encontrada.';
  when others then
     dscErro:= 'Ocorreu um erro inesperado: '||sqlerrm;
end;

Lá no java você valida esse parâmetro de saída fazendo:

...
...
<execução da procedure>

String dscErro = cs3.getString(<posicao>);

if (dscErro != null) {
  throw new Exception(dscErro);
}
....
....
....
N

mto obrigado pelas dicas! vou tentar implementa-las e logo vos digo como correu!!

Criado 10 de julho de 2006
Ultima resposta 12 de jul. de 2006
Respostas 7
Participantes 4