ORA-01843: not a valid month [Resolvido]

Estou com esse erro que está me tirando o sono “ORA-01843: not a valid month”

Já tentei passar a data como sql.Date, String e dá sempre o mesmo erro.

Quando chamo a procedure via PL/SQL Developer funciona perfeitamente.



import java.sql.CallableStatement;


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.text.ParseException;

public class Main {

    public static void main(String[] args) throws ParseException{

        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            String url = "jdbc:oracle:thin:@172.29.0.6:5100:BASE";
            Connection con = DriverManager.getConnection(url, "user", "password");

            CallableStatement cs = con.prepareCall("{ call sCtCriaLancInterface(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) }");
            
            
            cs.setInt(1, 4);
            cs.setString(2, null);
            cs.setString(3, null);
            cs.setInt(4, 5);
            cs.setString(5, null);
            cs.setString(6, null);
            cs.setTimestamp(7, new Timestamp(new java.util.Date().getTime()));
            cs.setString(8, "O");
            cs.setInt(9, 215);
            cs.setString(10, "4312002");
            cs.setString(11, null);
            cs.setInt(12, 32);
            cs.setString(13, null);
            cs.setString(14, "D");
            cs.setString(15, null);
            cs.setString(16, null);
            cs.setTimestamp(17, new Timestamp(new java.util.Date().getTime()));
            cs.setTimestamp(18, new Timestamp(new java.util.Date().getTime()));
            cs.setDouble(19, 100.01);
            cs.setString(20, null);
            cs.setString(21, null);
            cs.setInt(22, 34);
            cs.setString(23, null);
            cs.setString(24, null);

            cs.registerOutParameter(25, java.sql.Types.NUMERIC);
            cs.registerOutParameter(26, java.sql.Types.NUMERIC);
            cs.registerOutParameter(27, java.sql.Types.VARCHAR);

            cs.execute();
            
            System.out.println(cs.getInt(25));
            System.out.println(cs.getInt(26));
            System.out.println(cs.getString(27));

            System.out.println(new Timestamp(new java.util.Date().getTime()));

        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }

    }
}

Alguém tem idéia do que possa ser?

Olá

Se os tipos dos parametros de entrada estiverem certos, uma possibilidade que vejo é que o banco espera os dados em um formato (em inglês por exemplo) e o java está passando em outro formato (em português, por exemplo.
Apesar de você trabalhar com timestamp, pode acontecer dele estar mandando coisa errada. Tive problemas parecidos.

Se for o formato como faço para resolver?

Bom, nesse caso você tem que saber em qual formato o banco trabalha.
Os parametros que você tem que fornecer a JVM são -Duser.language=en -Duser.country=US isso faz com que a JVM funcione no locale en_US, se a lingua do banco tbem for en_US.

Deu esse erro no netbeans:

[color=red] javac: invalid flag: -Duser.language=en
Usage: javac
use -help for a list of possible options
FALHA NA CONSTRUÇÃO (tempo total: 0 segundos)

[/color]

As configurações no oracle:

SQL> Select * from nls_database_parameters;

PARAMETER                      VALUE
------------------------------ ----------------------------------------
NLS_LANGUAGE                   AMERICAN
NLS_TERRITORY                  AMERICA
NLS_CURRENCY                   $
NLS_ISO_CURRENCY               AMERICA
NLS_NUMERIC_CHARACTERS         .,
NLS_CHARACTERSET               WE8ISO8859P1
NLS_CALENDAR                   GREGORIAN
NLS_DATE_FORMAT                DD-MON-RR
NLS_DATE_LANGUAGE              AMERICAN
NLS_SORT                       BINARY
NLS_TIME_FORMAT                HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT           DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT             HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT        DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY              $
NLS_COMP                       BINARY
NLS_LENGTH_SEMANTICS           BYTE
NLS_NCHAR_CONV_EXCP            FALSE
NLS_NCHAR_CHARACTERSET         AL16UTF16
NLS_RDBMS_VERSION              9.2.0.4.0

20 rows selected

SQL> Select * from nls_session_parameters;

PARAMETER                      VALUE
------------------------------ ----------------------------------------
NLS_LANGUAGE                   BRAZILIAN PORTUGUESE
NLS_TERRITORY                  BRAZIL
NLS_CURRENCY                   R$
NLS_ISO_CURRENCY               BRAZIL
NLS_NUMERIC_CHARACTERS         ,.
NLS_CALENDAR                   GREGORIAN
NLS_DATE_FORMAT                DD/MM/RR
NLS_DATE_LANGUAGE              BRAZILIAN PORTUGUESE
NLS_SORT                       WEST_EUROPEAN
NLS_TIME_FORMAT                HH24:MI:SSXFF
NLS_TIMESTAMP_FORMAT           DD/MM/RR HH24:MI:SSXFF
NLS_TIME_TZ_FORMAT             HH24:MI:SSXFF TZR
NLS_TIMESTAMP_TZ_FORMAT        DD/MM/RR HH24:MI:SSXFF TZR
NLS_DUAL_CURRENCY              Cr$
NLS_COMP                       BINARY
NLS_LENGTH_SEMANTICS           BYTE
NLS_NCHAR_CONV_EXCP            FALSE

17 rows selected

SQL> Select * from nls_instance_parameters;

PARAMETER                      VALUE
------------------------------ ----------------------------------------
NLS_LANGUAGE                   AMERICAN
NLS_TERRITORY                  AMERICA
NLS_SORT                       
NLS_DATE_LANGUAGE              
NLS_DATE_FORMAT                
NLS_CURRENCY                   
NLS_NUMERIC_CHARACTERS         
NLS_ISO_CURRENCY               
NLS_CALENDAR                   
NLS_TIME_FORMAT                
NLS_TIMESTAMP_FORMAT           
NLS_TIME_TZ_FORMAT             
NLS_TIMESTAMP_TZ_FORMAT        
NLS_DUAL_CURRENCY              
NLS_COMP                       
NLS_LENGTH_SEMANTICS           BYTE
NLS_NCHAR_CONV_EXCP            FALSE

17 rows selected

Esse parametros são passados para o comando java e não javac.

Funcionou!!!
Obrigado pelas dicas furutani!!!

Será que tem como setar isso através do Locale direto na própria classe?

[quote=gilmaslima]Funcionou!!!
Obrigado pelas dicas furutani!!!

Será que tem como setar isso através do Locale direto na própria classe?[/quote]
Não sei, se descobrir conta pra gente. :smiley:

Dá pra fazer com o Locale adicionei essa linha e deu certo:

Locale.setDefault(new Locale("en", "US"));

Código completo:


import java.sql.CallableStatement;


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.text.ParseException;
import java.util.Locale;
import oracle.jdbc.OracleTypes;

public class Main {

    public static void main(String[] args) throws ParseException {

        try {
            
            Locale.setDefault(new Locale("en", "US"));
            
            Class.forName("oracle.jdbc.driver.OracleDriver");
            String url = "jdbc:oracle:thin:@172.29.0.6:5100:DEVELOP";
            Connection con = DriverManager.getConnection(url, "user", "password"); 

            
            CallableStatement cs = con.prepareCall("{ call sCtCriaLancInterface(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) }");

            
            cs.setInt(1, 4);
            cs.setString(2, null);
            cs.setString(3, null);
            cs.setInt(4, 5);
            cs.setString(5, null);
            cs.setString(6, null);
            
            cs.setTimestamp(7, new Timestamp(new java.util.Date().getTime())); 
            
            cs.setString(8, "O");
            cs.setInt(9, 215);
            cs.setString(10, "4312002");
            cs.setString(11, null);
            cs.setInt(12, 32);
            cs.setString(13, null);
            cs.setString(14, "D");
            cs.setString(15, null);
            cs.setString(16, null);
            cs.setTimestamp(17, new Timestamp(new java.util.Date().getTime())); 
            cs.setTimestamp(18, new Timestamp(new java.util.Date().getTime())); 
            cs.setDouble(19, 100.01);
            cs.setString(20, null);
            cs.setString(21, null);
            cs.setInt(22, 34);
            cs.setString(23, null);
            cs.setString(24, null);

            cs.registerOutParameter(25, OracleTypes.NUMERIC);
            cs.registerOutParameter(26, OracleTypes.NUMERIC);
            cs.registerOutParameter(27, OracleTypes.VARCHAR);

            cs.execute();

            System.out.println(cs.getInt(25));
            System.out.println(cs.getInt(26));
            System.out.println(cs.getString(27));
            
            

        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }

    }
}

Isso está acontecendo comigo com relatórios no Birt apenas no linux com base Oracle.

Para corrigir mudei o idioma para português e funcionou.

Existe alguma forma de corrigir isso sem alterar o idioma do SO ?

Desde já agradeço !

Resolvi da seguinte forma, fica a dica para quem ler…

se voce estiver usando setString para passar a data na consulta voce coloca

to_date(?,'dd/mm/yyyy') 

Abracos