Я называю это Oracle Хранимая процедура с использованием Spring SimpleJdbcCall. Я боролся с этим последние несколько дней, сначала я пропал (новый SqlOutParameter). Я решил ее, используя другой вопрос stackOverflow
Теперь код выдает PLS-00306: неверный номер или типы аргументов при вызове 'O_XEROX_PRNT_PRT'
Вот полное исключение:
CallableStatementCallback; bad SQL grammar [{? = call IMPL_XEROX_SCHEMA.O_XEROX_PRNT_PRT(?,?,?)}];
nested exception is java.sql.SQLException:
ORA-06550: line 1, column 13:
PLS-00306: wrong number or types of arguments in call to 'O_XEROX_PRNT_PRT'
ORA-06550: line 1, column 7: PL/SQL: Statement ignored
Здесь хранимая процедура, я постарался максимально упростить ее для тестирования. так что ничего не делает, кроме рандомизации некоторых значений и возврата случайного сообщения,
Хранимая процедура выполняет штраф из SqlDeveloper ...
CREATE OR REPLACE PROCEDURE O_XEROX_PRNT_PRT
(
CLIENT_KEY IN VARCHAR2
,P_STATUS IN VARCHAR2
-- OUTPUT back to java
, O_STATUS OUT BOOLEAN
, O_MESSAGE OUT VARCHAR2
) AS
PROC_STATUS BOOLEAN;
PROC_ERROR_MESSAGE VARCHAR2(4000);
rand_num number;
BEGIN
dbms_output.put_line('O_XEROX_PRNT_PRT ');
select round(dbms_random.value(1,10)) into rand_num from dual;
IF rand_num > 8 THEN
PROC_STATUS := TRUE;
PROC_ERROR_MESSAGE := 'ALL IS GOOD';
ELSE
PROC_STATUS := FALSE;
PROC_ERROR_MESSAGE := 'SOMTHING WENT WRONG!!! ';
END IF;
END O_XEROX_PRNT_PRT;
Java код, который я использую:
String CLIENT_KEY = 'CLIENT_KEY val';
String P_STATUS = 'Printer works';
Boolean O_STATUS =true;
String O_MESSAGE ;
JdbcTemplate template = new JdbcTemplate(printerHubPortalDS);
SimpleJdbcCall jdbcCall = new SimpleJdbcCall(template).withProcedureName("O_XEROX_PRNT_PRT")
.withoutProcedureColumnMetaDataAccess()
.withReturnValue()
.declareParameters(
new SqlParameter("CLIENT_KEY", Types.VARCHAR),
new SqlParameter("P_STATUS" , Types.VARCHAR),
new SqlOutParameter("O_STATUS", Types.VARCHAR),
new SqlOutParameter("O_MESSAGE", Types.VARCHAR)
);
MapSqlParameterSource paramMap = new MapSqlParameterSource()
.addValue("CLIENT_KEY",CLIENT_KEY)
.addValue("P_STATUS" ,P_STATUS );
//This line is throwing the error
Map<String, Object> resultMap = jdbcCall.execute(paramMap);
String status = (String)resultMap.get("O_STATUS");
String message = (String) resultMap.get("O_MESSAGE");