Я делаю вставку в таблицу 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);
Любая идея? Спасибо!
Что происходит, когда вы пытаетесь выполнить приведение типа: stmt.setObject (7, (number) salaryValue, OracleTypes.NUMBER);
@ErayBalkanli какой тип objEMPLOYE.getSalary()? А зачем вам salaryValue.replace(".", ",")?
Значение для catch (Exception ex) ex.getmessage (): Для входной строки: ".3"
ObjEMPLOYE.getSalary () его двойной, salaryValue.replace (".", ","): Я пробовал что-то, и я увидел, что в sql-разработчике значения double были с "," а в java были с "". так что я пробую это
Попробуйте изолировать проблему. Создайте таблицу с одним столбцом number(2,2), процедуру записи в указанную таблицу, и вызовите ее из java с помощью stmt.setDouble(1, 0.3). Исключение все еще происходит?
Я думаю, EMPLOYEE_ID NUMBER (6,0) не будет принимать значение 0,3. Возможно, вам понадобится сделать это (6,1)




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