Вставить из Java в Oracle

Я делаю вставку в таблицу EMPLOYEES:

EMPLOYEE_ID NUMBER(6,0)     
FIRST_NAME  VARCHAR2(20 BYTE)   
LAST_NAME   VARCHAR2(25 BYTE)
EMAIL   VARCHAR2(25 BYTE)
PHONE_NUMBER    VARCHAR2(20 BYTE)
HIRE_DATE   DATE
JOB_ID  VARCHAR2(10 BYTE)   
SALARY  NUMBER(8,2)
COMMISSION_PCT  NUMBER(2,2) 
MANAGER_ID  NUMBER(6,0)     
DEPARTMENT_ID   NUMBER(4,0)     

Я звоню этому СП из java:

create or replace PROCEDURE SP_EMPLOYES_INSERT 
(
  FIRST_NAME IN EMPLOYEES.EMPLOYEE_ID%TYPE 
, LAST_NAME IN EMPLOYEES.LAST_NAME%TYPE 
, EMAIL IN EMPLOYEES.EMAIL%TYPE  
, PHONE_NUMBER IN EMPLOYEES.PHONE_NUMBER%TYPE  
, HIRE_DATE IN EMPLOYEES.HIRE_DATE%TYPE  
, JOB_ID IN EMPLOYEES.JOB_ID%TYPE  
, SALARY IN EMPLOYEES.SALARY%TYPE 
, COMMISSION_PCT IN EMPLOYEES.COMMISSION_PCT%TYPE  
, MANAGER_ID IN EMPLOYEES.MANAGER_ID%TYPE  
, DEPARTMENT_ID IN EMPLOYEES.DEPARTMENT_ID%TYPE  
, C_EMPLOYE OUT SYS_REFCURSOR
) IS
EMP_ID EMPLOYEES.EMPLOYEE_ID%TYPE;
MENSAJE VARCHAR2(1000);
BEGIN

 SELECT (NVL(MAX(EMPLOYEE_ID),0) + 1) INTO EMP_ID FROM EMPLOYEES;
 INSERT INTO EMPLOYEES(EMPLOYEE_ID,FIRST_NAME,LAST_NAME,EMAIL,PHONE_NUMBER,HIRE_DATE,JOB_ID,SALARY,COMMISSION_PCT,MANAGER_ID,DEPARTMENT_ID)
                VALUES(EMP_ID     ,FIRST_NAME,LAST_NAME,EMAIL,PHONE_NUMBER,HIRE_DATE,JOB_ID,SALARY,COMMISSION_PCT,MANAGER_ID,DEPARTMENT_ID);
  MENSAJE:= 'Se inserto con exito';

  OPEN C_EMPLOYE FOR
   SELECT MENSAJE MSG FROM DUAL;

 EXCEPTION
 WHEN OTHERS THEN
 MENSAJE:= SQLERRM;
   OPEN C_EMPLOYE FOR
   SELECT MENSAJE MSG FROM DUAL;
   --DBMS_OUTPUT.PUT_LINE(SQLERRM);

END SP_EMPLOYES_INSERT;

И код в java:

   public boolean PutEmployee(int action) throws SQLException
    {
        boolean result = false;
        Connection con = null;
        CallableStatement stmt = null;
        ResultSet rs = null;
        String mensaje = null;

        try 
        {
            if (!validateEmployee(action))
                return false;

            con = OracleConnection.getDBConnection();
              if (action == 1)
                  stmt = con.prepareCall("call SP_EMPLOYES_INSERT(?,?,?,?,?,?,?,?,?,?,?)");
              else if (action == 2)
                  stmt = con.prepareCall("call SP_EMPLOYEES_UPDATE(?,?,?,?,?,?,?,?,?,?,?)");
              else if (action == 3)
                  stmt = con.prepareCall("call SP_EMPLOYEES_DELETE(?)");
              else  if (action == 4)
                  stmt = con.prepareCall("call SP_EMPLOYEES_SELECT_BY_ID(?)");

            if (action == 2)
                stmt.setInt(11, objEMPLOYE.getEmployeeId());
            else if ( action == 3 || action == 4)
               stmt.setInt(1, objEMPLOYE.getEmployeeId());

            if (action == 1 || action == 2)
            {
                if (action == 1)
                  stmt.registerOutParameter(11, OracleTypes.CURSOR);

                stmt.setString(1, objEMPLOYE.getFirstName());
                stmt.setString(2, objEMPLOYE.getLastName());
                stmt.setString(3, objEMPLOYE.getPhoneNumber());
                stmt.setString(4, objEMPLOYE.getEmal());

                SimpleDateFormat dt1 = new SimpleDateFormat("yyyyy-mm-dd");
                oracle.sql.DATE hireDate = new oracle.sql.DATE(objEMPLOYE.getHireDate());
                stmt.setObject(5, hireDate, OracleTypes.DATE);

                stmt.setString(6, objEMPLOYE.getJobId());
                stmt.setDouble(7, objEMPLOYE.getSalary());
                stmt.setDouble(8, objEMPLOYE.getCommissionPct()); 
                stmt.setInt(9,objEMPLOYE.getManagerId());
                stmt.setInt(10,objEMPLOYE.getDepartmentId());
            }

           if (action == 1)
           {
               //INSERT
               if (stmt.execute())
                 result = true;
               else
                  result = false;  
              rs = ((OracleCallableStatement)stmt).getCursor(11);
              while(rs.next())
                 mensaje = rs.getString("MSG");
           }
           else if (action == 2)
           {
               //UPDATE
               if (stmt.execute())
                 result = true;
               else
                  result = false;
           }
           else if (action == 3)
           {
               //DELETE
               if (stmt.execute())                 
                 result = true;
               else
                  result = false;
           }
           else if (action == 4)
           {
               //CONSULTA POR ID
               stmt.registerOutParameter("P_CURSOR", OracleTypes.CURSOR);
               rs = stmt.getResultSet();
               objEMPLOYE = new EMPLOYES();

               while(rs.next())
               {               
                   objEMPLOYE.setCommissionPct(rs.getDouble("COMMISSION_PCT"));
                   objEMPLOYE.setDepartmentId(rs.getInt("DEPARTMENT_ID"));
                   objEMPLOYE.setEmail(rs.getString("EMAIL"));
                   objEMPLOYE.setEmployeeId(rs.getInt("EMPLOYEE_ID"));
                   objEMPLOYE.setFirstName(rs.getString("FIRST_NAME"));
                   objEMPLOYE.setHireDate(rs.getDate("HIRE_DATE"));
                   objEMPLOYE.setJobId(rs.getString("JOB_ID"));
                   objEMPLOYE.setLastName(rs.getString("LAST_NAME"));
                   objEMPLOYE.setManagerId(rs.getInt("MANAGER_ID"));
                   objEMPLOYE.setPhoneNumber(rs.getString("PHONE_NUMBER"));
                   objEMPLOYE.setSalary(rs.getDouble("SALARY"));
               } 
               result = true;
           }
        }
        catch(Exception ex)
        {
          System.out.print(ex.getMessage());
          result = false;
        }
        finally
        {
            if (con!=null)
                con.close();
            if (rs !=null)
                rs.close(); 
        }
        return result;
    }

И я получаю сообщение об ошибке в catch: ORA-01722: "número no válido", когда я выполняю выполнение в callablestatement.

Я не знаю, как преобразовать java double в число (8,2), число (2,2). Кто-нибудь знает, как я могу это вставить?

Я помещаю эти значения в объект employee:

          empService.objEMPLOYE.setCommissionPct(0.3);
          empService.objEMPLOYE.setDepartmentId(3);
          empService.objEMPLOYE.setEmail("[email protected]");
          empService.objEMPLOYE.setFirstName("Matias");
          empService.objEMPLOYE.setHireDate(new java.sql.Date(2018, 11, 10));
          empService.objEMPLOYE.setJobId("a1");
          empService.objEMPLOYE.setLastName("Perez");
          empService.objEMPLOYE.setManagerId(1);
          empService.objEMPLOYE.setPhoneNumber("1545659865");
          empService.objEMPLOYE.setSalary(150.3);

Любая идея? Спасибо!

что за сообщение об ошибке

Eray Balkanli 11.11.2018 15:55

Что происходит, когда вы пытаетесь выполнить приведение типа: stmt.setObject (7, (number) salaryValue, OracleTypes.NUMBER);

Eray Balkanli 11.11.2018 15:58

@ErayBalkanli какой тип objEMPLOYE.getSalary()? А зачем вам salaryValue.replace(".", ",")?

user7294900 11.11.2018 16:30

Значение для catch (Exception ex) ex.getmessage (): Для входной строки: ".3"

susta250 11.11.2018 16:31

ObjEMPLOYE.getSalary () его двойной, salaryValue.replace (".", ","): Я пробовал что-то, и я увидел, что в sql-разработчике значения double были с "," а в java были с "". так что я пробую это

susta250 11.11.2018 16:33

Попробуйте изолировать проблему. Создайте таблицу с одним столбцом number(2,2), процедуру записи в указанную таблицу, и вызовите ее из java с помощью stmt.setDouble(1, 0.3). Исключение все еще происходит?

Timekiller 12.11.2018 15:04

Я думаю, EMPLOYEE_ID NUMBER (6,0) не будет принимать значение 0,3. Возможно, вам понадобится сделать это (6,1)

Peter Gerald 15.11.2019 08:31
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
7
101
0

Другие вопросы по теме