Erro ao inserir uma string numa base de dados

9 respostas
N

Caros Amigos,

Tenho um problema , o qual tentei ver se aqui no forum ja o tinham exposto, mas, não fui bem sucedido. Contudo, encontrei casos algo semelhantes mas mesmo assim penso que as suas soluções não se aplicam.

Bem resumindo, o meu problema é tentar inserir uma string, como por exemplo “17/01/2008” em duas bases de dados idênticas em Oracle e em MS SQL Server. Os campos nas repectivas tabelas estão em varchar(30) e os procedimentos também sendo o interface em JSP.

Contudo o meu resultado é:

Excepção do SQL Server: For input string: "17/01/2008" Excepção do Oracle: For input string: "17/01/2008"

Alguém pode ajudar-me? :roll: :roll: :?:

Um grande abraço de Portugal

9 Respostas

M

Mano, posta o codigo q está tentando inserir, aonde está lançando a excessao, etc.

rockstorm

Posta o trecho onde você faz o insert…fica mais facil te ajudar

B

fica difícil de ajudar só com a exceção …
posta a parte do código que faz a inserção nos bancos…

Att

RodyBr

melhor postar o código do insert, mas vai uma dica.

verifique o formato dos campos que estão no Oracle e no SQL Server, e como você está tratando no insert, pois no Oracle por exemplo você precisa tratar os campos de data, ex: string Data = todate(‘dd/mm/yyyy’,‘01/01/2008’).

veja tb esse texto recente no fórum: http://www.guj.com.br/posts/list/80103.java
:wink:

B

eu tb tinha pensado nisso, mas ele disse que os campos estão como varchar(30). Aí eu acho que nem é isso …

Att

N

pessoal aki vai o codigo:

o procedimento em SQL Server:
CREATE PROCEDURE dbo.INSERE_CURSO
(
  @INSIDCURSO              NUMERIC(2,0), -- 1
  @INSIDMOTIVO             NUMERIC(18,0), -- 2
  @INSINIDULIZADOR         NUMERIC(4,0), -- 3
  @INSIDTCURSO             NUMERIC(1,0), -- 4
  @INSDESCCURSO            VARCHAR(100), -- 5
  @INSNUMANOSCURSO         NUMERIC(1,0), -- 6
  @INSINICIAISCURSO        VARCHAR(5), -- 7
  @INSDINICURSO            VARCHAR(30), -- 8
  @INSDUALCURSO            VARCHAR(30), -- 9
  @INSDFIMCURSO            VARCHAR(30), -- 10
  @INSOBSCURSO             VARCHAR(500), -- 11
  @ERRORNUMBER             NUMERIC(18,0) OUTPUT, -- 12
  @ERRORSEVERITY           VARCHAR(100)  OUTPUT, -- 13
  @ERRORSTATE              VARCHAR(100)  OUTPUT, -- 14
  @ERRORPROCEDURE          VARCHAR(100)  OUTPUT, -- 15
  @ERRORLINE               VARCHAR(100)  OUTPUT, -- 16
  @ERRORMESSAGE            VARCHAR(100)  OUTPUT -- 17
)
AS
BEGIN
     BEGIN TRY

   INSERT INTO
    dbo.CURSOS(
                    ID_CURSO,
                    ID_MOTIVO,
                    ID_UTILIZADOR,
                    ID_TIPO_CURSO,
                    NOME_CURSO,
                    NUM_ANOS_CURSO,
                    INICIAIS_CURSO,
                    DATA_INICIO_CURSO,
                    DATA_U_ALTERACAO_CURSO,
                    DATA_FIM_CURSO,
                    OBS_CURSO)
     VALUES(
                    @INSIDCURSO,
                    @INSIDMOTIVO,
                    @INSINIDULIZADOR,
                    @INSIDTCURSO,
                    @INSDESCCURSO,
                    @INSNUMANOSCURSO,
                    @INSINICIAISCURSO,
                    @INSDINICURSO,
                    @INSDUALCURSO,
                    @INSDFIMCURSO,
                    @INSOBSCURSO)
                END TRY
     BEGIN CATCH
     SELECT
        @ERRORNUMBER = ERROR_NUMBER(),
        @ERRORSEVERITY = ERROR_SEVERITY(),
        @ERRORSTATE  = ERROR_STATE(),
        @ERRORPROCEDURE = ERROR_PROCEDURE(),
        @ERRORLINE = ERROR_LINE(),
        @ERRORMESSAGE = ERROR_MESSAGE()
     END CATCH;
  
END

o procedimento em Oracle:

PROCEDURE INSERE_CURSO
(
  INSINIDCURSO             IN CURSOS.ID_CURSO%TYPE, -- 1
  INSINIDMOTIVO            IN CURSOS.ID_MOTIVO%TYPE, -- 2
  INSINIDUTILIZADOR        IN CURSOS.ID_UTILIZADOR%TYPE, -- 3
  INSINIDTCURSO            IN CURSOS.ID_TIPO_CURSO%TYPE, -- 4
  INSINDESCCURSO           IN CURSOS.NOME_CURSO%TYPE, -- 5
  INSINNUMANOSCURSO        IN CURSOS.NUM_ANOS_CURSO%TYPE, -- 6
  INSININICIAISCURSO       IN CURSOS.INICIAIS_CURSO%TYPE, -- 7
  INSINDINICURSO           IN VARCHAR, -- 8
  INSINDATAUALTCURSO       IN VARCHAR, -- 9
  INSINDFIMCURSO           IN VARCHAR, -- 10
  INSINOBSCURSO            IN CURSOS.OBS_CURSO%TYPE, -- 11
  DSCERRO                  OUT 	VARCHAR, -- 12
  CONTROLVAL			   OUT	INT -- 13
)
IS

CONTADORES INT;

BEGIN

select
		COUNT(*) into CONTADORES
	FROM
		CURSOS
	where
		CURSOS.ID_CURSO = INSINIDCURSO;

if CONTADORES > 0 then
	 CONTROLVAL := -2;
	 
ELSE	 
  INSERT 
  INTO CURSOS(
  		ID_CURSO,
  		ID_MOTIVO,
		ID_UTILIZADOR,
  		ID_TIPO_CURSO,
  		NOME_CURSO,
  		NUM_ANOS_CURSO,
  		INICIAIS_CURSO,
  		DATA_INICIO_CURSO,
  		DATA_U_ALTERACAO_CURSO,
  		DATA_FIM_CURSO,
  		OBS_CURSO)
VALUES(
  		INSINIDCURSO,
  		INSINIDUTILIZADOR,
  		INSINIDMOTIVO,
  		INSINIDTCURSO,
  		INSINDESCCURSO,
  		INSINNUMANOSCURSO,
  		INSININICIAISCURSO,
  		INSINDINICURSO,
  		INSINDATAUALTCURSO,
  		INSINDFIMCURSO,
  		INSINOBSCURSO);
  		
  		CONTROLVAL :=0;
  
  COMMIT;

END IF;
  
EXCEPTION
   WHEN ACCESS_INTO_NULL THEN
      DSCERRO:= 'ATRIBUTO NULO';
      ROLLBACK;
   WHEN PROGRAM_ERROR THEN
      DSCERRO:= 'ERRO INTERNO';
      ROLLBACK;
   WHEN LOGIN_DENIED THEN
      DSCERRO:= 'ACESSO INVALIDO';
      ROLLBACK;
   WHEN NOT_LOGGED_ON THEN
      DSCERRO:= 'NÃO ESTÁ ESTABELECIDA UMA CONEXÃO';
      ROLLBACK;
   WHEN OTHERS THEN
      DSCERRO:= 'OCORREU UM ERRO INESPERADO: '||SQLERRM;
	  ROLLBACK;
  		
END;

Aui a função para inserção no MS SQL Server:

public String[] INSCURS_MSSQL(String[] indept){
        
        intusearray = CHECKIDCURS_MSSQL();
        
        idCURS = Integer.valueOf(intusearray[1]).intValue();
        
        idCURS = idCURS+1;
        
        
        try{
            
            Class.forName(drivermssql);
            conn_insCURSTSQL = DriverManager.getConnection(constrmssql);
            CallableStatement cs_insCURSTSQL= conn_insCURSTSQL.prepareCall("{call dbo.INSERE_CURSO(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}");
            
            cs_insCURSTSQL.setInt(1,idCURS);//1
            cs_insCURSTSQL.setInt(2,Integer.valueOf(indept[1]).intValue());//2
            cs_insCURSTSQL.setInt(3,Integer.valueOf(indept[2]).intValue());//3
            cs_insCURSTSQL.setInt(4,Integer.valueOf(indept[3]).intValue());//4
            cs_insCURSTSQL.setString(5,indept[4]);//5
            cs_insCURSTSQL.setInt(6,Integer.valueOf(indept[5]).intValue());//6
            cs_insCURSTSQL.setString(7,indept[6]);//7
            cs_insCURSTSQL.setString(8,indept[7]);//8
            cs_insCURSTSQL.setString(9,indept[8]);//9
            cs_insCURSTSQL.setString(10,indept[9]);//10
            cs_insCURSTSQL.setString(11,indept[10]);//11
            cs_insCURSTSQL.registerOutParameter(12,Types.NUMERIC);//12
            cs_insCURSTSQL.registerOutParameter(13,Types.VARCHAR);//13
            cs_insCURSTSQL.registerOutParameter(14,Types.VARCHAR);//14
            cs_insCURSTSQL.registerOutParameter(15,Types.VARCHAR);//15
            cs_insCURSTSQL.registerOutParameter(16,Types.VARCHAR);//16
            cs_insCURSTSQL.registerOutParameter(17,Types.VARCHAR);//17
            
            cs_insCURSTSQL.execute();
            
            ERRORNUMBER=cs_insCURSTSQL.getInt(12);
            ERRORSEVERITY=(String)cs_insCURSTSQL.getObject(13);
            ERRORSTATE=(String)cs_insCURSTSQL.getObject(14);
            ERRORPROCEDURE=(String)cs_insCURSTSQL.getObject(15);
            ERRORLINE=(String)cs_insCURSTSQL.getObject(16);
            ERRORMESSAGE=(String)cs_insCURSTSQL.getObject(17);
            
            if (ERRORNUMBER != 0){
                SETERROR_MSSQL(ERRORNUMBER,ERRORSEVERITY, ERRORSTATE,ERRORPROCEDURE,ERRORLINE,ERRORMESSAGE);
            } else {java.util.Arrays.fill(errordatamssql,null);}
            
            
        } catch(Exception e){
            if (e.getMessage()!=null){
                
                SETEXCEP_MSSQL(e.getMessage());}
        }
        
        return saida;
        
    }

Aqui Para o Oracle:

public String[] INSCURS_ORASQL(String[] indept){
        
        intusearray = CHECKIDCURS_ORASQL();
        
        idCURS = Integer.valueOf(intusearray[1]).intValue();
        
        idCURS = idCURS+1;
        
        
        try{
            
            Class.forName(driveroracle);
            conn_insCURSPLSQL = DriverManager.getConnection(constroracle,useroracle,BDPass);
            CallableStatement cs_insCURSPLSQL = conn_insCURSPLSQL.prepareCall("{call INSERE_CURSO(?,?,?,?,?,?,?,?,?,?,?,?,?)}");
            
            
            cs_insCURSPLSQL.setInt(1,idCURS);//1
            cs_insCURSPLSQL.setInt(2,Integer.valueOf(indept[1]).intValue());//2
            cs_insCURSPLSQL.setInt(3,Integer.valueOf(indept[2]).intValue());//3
            cs_insCURSPLSQL.setInt(4,Integer.valueOf(indept[3]).intValue());//4
            cs_insCURSPLSQL.setString(5,indept[4]);//5
            cs_insCURSPLSQL.setInt(6,Integer.valueOf(indept[5]).intValue());//6
            cs_insCURSPLSQL.setString(7,indept[6]);//7
            cs_insCURSPLSQL.setString(8,indept[7]);//8
            cs_insCURSPLSQL.setString(9,indept[8]);//9
            cs_insCURSPLSQL.setString(10,indept[9]);//10
            cs_insCURSPLSQL.setString(11,indept[10]);//11
            cs_insCURSPLSQL.registerOutParameter(12,Types.VARCHAR);
            cs_insCURSPLSQL.registerOutParameter(13,Types.NUMERIC);
            
            
            cs_insCURSPLSQL.execute();
            
            dscerro = (String) cs_insCURSPLSQL.getObject(12);
            controlval= cs_insCURSPLSQL.getInt(13);
            

            if (controlval !=0){
                SETERROR_ORASQL(controlval, dscerro);
            } else {java.util.Arrays.fill(errordataoracle,null);}
            
            
        } catch(Exception e){
            if (e.getMessage()!=null){
                SETEXCEP_ORASQL(e.getMessage());}
        }
        
        return saida;
        
    }

E sim os campos para as datas estão em varchar(30).

que me dizem? :roll:

obrgidao

M

Uma pergunta, essas procedures excutam sem erro se vc fizer de forma manual??

N

Sim , amigo funcionam…
:roll:

M
CallableStatement cs_insCURSPLSQL = conn_insCURSPLSQL.prepareCall("{call INSERE_CURSO(?,?,?,?,?,?,?,?,?,?,?,?,?)}");

Tenta chamar dessa forma:

CallableStatement cs_insCURSPLSQL = conn_insCURSPLSQL.prepareCall("begin INSERE_CURSO(?,?,?,?,?,?,?,?,?,?,?,?,?) end; commit;");

Isso no oracle, e me diz se resolveu

Criado 22 de janeiro de 2008
Ultima resposta 27 de jan. de 2008
Respostas 9
Participantes 5