Вызов Oracle Бросков хранимых процедур. Вызвано: PLS-00306: неверный номер или типы аргументов. - PullRequest
0 голосов
/ 04 февраля 2020

Я называю это 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");
...