PLS-00306:从Spring JDBC调用时,调用中的参数数量或类型错误

PLS-00306:从Spring JDBC调用时,调用中的参数数量或类型错误,spring,jdbc,procedure,privileges,Spring,Jdbc,Procedure,Privileges,我有两个模式——OwnerSchema和AppSchema。我对从OwnerSchema到AppSchema的所有包都授予执行权限。当我尝试从AppSchema后端执行任何过程时,我能够执行该过程。当我试图从JavaSpringJDBC执行相同的过程时,我得到了上面的错误。我能够从OwnerSchema从Java执行这个过程 我能够使用AppSchema访问JavaSpringJDBC应用程序中的所有表 我已使用以下触发器在登录时指向OwnerSchmea org.springframework

我有两个模式——OwnerSchema和AppSchema。我对从OwnerSchema到AppSchema的所有包都授予执行权限。当我尝试从AppSchema后端执行任何过程时,我能够执行该过程。当我试图从JavaSpringJDBC执行相同的过程时,我得到了上面的错误。我能够从OwnerSchema从Java执行这个过程

我能够使用AppSchema访问JavaSpringJDBC应用程序中的所有表

我已使用以下触发器在登录时指向OwnerSchmea

org.springframework.jdbc.BadSqlGrammarException: CallableStatementCallback; bad SQL grammar  
[{call pkg_name.procedure_name()}]; nested exception is java.sql.SQLException: ORA-06550: line 1,  column 7:
PLS-00306: wrong number or types of arguments in call to 'PROCEDURE_NAME'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
这是对程序的调用

 CREATE OR REPLACE TRIGGER FINAL_APP_USER.AFTER_LOGON_TRG
    AFTER LOGON ON FINAL_APP_USER.SCHEMA
    BEGIN
      DBMS_APPLICATION_INFO.SET_MODULE(USER, 'Initialized');
    EXECUTE IMMEDIATE 'ALTER SESSION SET current_schema=TEST'; --enter owner
    END;
    /
SimpleJdbcCall simpleJdbcCall = getSimpleJdbcCall()
                    .withCatalogName("pkg_name").withProcedureName(
                            "procedure_name").returningResultSet(
                            "C_Srf_1", new RowMapper<FinalCountForQuestions>() {
                                public FinalCountForQuestions mapRow(
                                        ResultSet rs, int rowNum)
                                        throws SQLException {

                                    ...

                                    return finalCountForQuestions;
                                }
                            });

            Map<String, Object> mapOfOutputParams = simpleJdbcCall.execute();

SpringJDBC模板在调用数据库过程时生成以下查询

 CREATE OR REPLACE TRIGGER FINAL_APP_USER.AFTER_LOGON_TRG
    AFTER LOGON ON FINAL_APP_USER.SCHEMA
    BEGIN
      DBMS_APPLICATION_INFO.SET_MODULE(USER, 'Initialized');
    EXECUTE IMMEDIATE 'ALTER SESSION SET current_schema=TEST'; --enter owner
    END;
    /
SimpleJdbcCall simpleJdbcCall = getSimpleJdbcCall()
                    .withCatalogName("pkg_name").withProcedureName(
                            "procedure_name").returningResultSet(
                            "C_Srf_1", new RowMapper<FinalCountForQuestions>() {
                                public FinalCountForQuestions mapRow(
                                        ResultSet rs, int rowNum)
                                        throws SQLException {

                                    ...

                                    return finalCountForQuestions;
                                }
                            });

            Map<String, Object> mapOfOutputParams = simpleJdbcCall.execute();
因此,当您使用ApplicationUser调用数据库过程时,它将使用您的ApplicationUser名称查看所有参数视图,而不会找到任何参数。所以,解决方案是,当您调用一个过程时,按如下方式传递所有者的模式名

SELECT PACKAGE_NAME AS PROCEDURE_CAT,
OWNER AS PROCEDURE_SCHEM,
OBJECT_NAME AS PROCEDURE_NAME,
ARGUMENT_NAME AS COLUMN_NAME,
DECODE(POSITION, 0, 5,
DECODE(IN_OUT, 'IN', 1,
'OUT', 4,
'IN/OUT', 2,
0)) AS COLUMN_TYPE,
DECODE (DATA_TYPE, 'CHAR', 1,
'VARCHAR2', 12,
'NUMBER', 3,
'LONG', -1,
'DATE', 91,
'RAW', -3,
'LONG RAW', -4,
'TIMESTAMP', 93, 
'TIMESTAMP WITH TIME ZONE', -101, 
'TIMESTAMP WITH LOCAL TIME ZONE', -102, 
'INTERVAL YEAR TO MONTH', -103, 
'INTERVAL DAY TO SECOND', -104, 
'BINARY_FLOAT', 100, 'BINARY_DOUBLE', 101, 1111) AS DATA_TYPE,
DECODE(DATA_TYPE, 'OBJECT', TYPE_OWNER || '.' || TYPE_NAME, DATA_TYPE) AS TYPE_NAME,
DECODE (DATA_PRECISION, NULL, DATA_LENGTH,
DATA_PRECISION) AS PRECISION,
DATA_LENGTH AS LENGTH,
DATA_SCALE AS SCALE,
10 AS RADIX,
1 AS NULLABLE,
NULL AS REMARKS,
SEQUENCE,
OVERLOAD,
DEFAULT_VALUE
from ALL_ARGUMENTS
where OWNER like '<USER>' escape  '/'
and OBJECT_NAME like '<PROCEDURE_NAME>' escape '/' 
and PACKAGE_NAME like '<PACKAGE_NAME>' ESCAPE '/'                   
AND (ARGUMENT_NAME LIKE 'C_SRF_1' ESCAPE '/'
OR (ARGUMENT_NAME IS NULL
and DATA_TYPE is not null))
--and
--other arguments
ORDER BY PROCEDURE_SCHEM, PROCEDURE_NAME, OVERLOAD, SEQUENCE;

SpringJDBC模板在调用数据库过程时生成以下查询

 CREATE OR REPLACE TRIGGER FINAL_APP_USER.AFTER_LOGON_TRG
    AFTER LOGON ON FINAL_APP_USER.SCHEMA
    BEGIN
      DBMS_APPLICATION_INFO.SET_MODULE(USER, 'Initialized');
    EXECUTE IMMEDIATE 'ALTER SESSION SET current_schema=TEST'; --enter owner
    END;
    /
SimpleJdbcCall simpleJdbcCall = getSimpleJdbcCall()
                    .withCatalogName("pkg_name").withProcedureName(
                            "procedure_name").returningResultSet(
                            "C_Srf_1", new RowMapper<FinalCountForQuestions>() {
                                public FinalCountForQuestions mapRow(
                                        ResultSet rs, int rowNum)
                                        throws SQLException {

                                    ...

                                    return finalCountForQuestions;
                                }
                            });

            Map<String, Object> mapOfOutputParams = simpleJdbcCall.execute();
因此,当您使用ApplicationUser调用数据库过程时,它将使用您的ApplicationUser名称查看所有参数视图,而不会找到任何参数。所以,解决方案是,当您调用一个过程时,按如下方式传递所有者的模式名

SELECT PACKAGE_NAME AS PROCEDURE_CAT,
OWNER AS PROCEDURE_SCHEM,
OBJECT_NAME AS PROCEDURE_NAME,
ARGUMENT_NAME AS COLUMN_NAME,
DECODE(POSITION, 0, 5,
DECODE(IN_OUT, 'IN', 1,
'OUT', 4,
'IN/OUT', 2,
0)) AS COLUMN_TYPE,
DECODE (DATA_TYPE, 'CHAR', 1,
'VARCHAR2', 12,
'NUMBER', 3,
'LONG', -1,
'DATE', 91,
'RAW', -3,
'LONG RAW', -4,
'TIMESTAMP', 93, 
'TIMESTAMP WITH TIME ZONE', -101, 
'TIMESTAMP WITH LOCAL TIME ZONE', -102, 
'INTERVAL YEAR TO MONTH', -103, 
'INTERVAL DAY TO SECOND', -104, 
'BINARY_FLOAT', 100, 'BINARY_DOUBLE', 101, 1111) AS DATA_TYPE,
DECODE(DATA_TYPE, 'OBJECT', TYPE_OWNER || '.' || TYPE_NAME, DATA_TYPE) AS TYPE_NAME,
DECODE (DATA_PRECISION, NULL, DATA_LENGTH,
DATA_PRECISION) AS PRECISION,
DATA_LENGTH AS LENGTH,
DATA_SCALE AS SCALE,
10 AS RADIX,
1 AS NULLABLE,
NULL AS REMARKS,
SEQUENCE,
OVERLOAD,
DEFAULT_VALUE
from ALL_ARGUMENTS
where OWNER like '<USER>' escape  '/'
and OBJECT_NAME like '<PROCEDURE_NAME>' escape '/' 
and PACKAGE_NAME like '<PACKAGE_NAME>' ESCAPE '/'                   
AND (ARGUMENT_NAME LIKE 'C_SRF_1' ESCAPE '/'
OR (ARGUMENT_NAME IS NULL
and DATA_TYPE is not null))
--and
--other arguments
ORDER BY PROCEDURE_SCHEM, PROCEDURE_NAME, OVERLOAD, SEQUENCE;

因为类似的错误浪费了一个小时。我在目录名中有模式名。过程被很好地找到,但得到了错误。我必须分别声明所有位tt.payment\U requests.start\U过程:

SimpleJdbcCall simpleJdbcCall = getSimpleJdbcCall()
                    .withSchemaName(<OwnerSchema>)
                    .withCatalogName("pkg_name").withProcedureName(
                            "procedure_name").returningResultSet(
                            "C_Srf_1", new RowMapper<FinalCountForQuestions>() {

因为类似的错误浪费了一个小时。我在目录名中有模式名。过程被很好地找到,但得到了错误。我必须分别声明所有位tt.payment\U requests.start\U过程:

SimpleJdbcCall simpleJdbcCall = getSimpleJdbcCall()
                    .withSchemaName(<OwnerSchema>)
                    .withCatalogName("pkg_name").withProcedureName(
                            "procedure_name").returningResultSet(
                            "C_Srf_1", new RowMapper<FinalCountForQuestions>() {

您可以附加用于访问该过程的SQL语句吗?您好,我已经添加了过程调用的代码。包pkg_name中是否有名为procedure_name的过程?在实际应用程序中,名称是奇数。能否附加用于访问该过程的SQL语句?您好,我已添加了过程调用的代码。在包pkg_name中是否有名为procedure_name的过程?这些名字在实际应用中很奇怪。非常感谢!我是通过一个同义词访问一个过程的,我必须为它指定所有者模式才能工作。非常感谢!我通过一个同义词访问一个过程,我必须为它指定所有者模式。