oracle 无程序/函数/签名

qmelpv7a  于 2023-01-25  发布在  Oracle
关注(0)|答案(3)|浏览(113)

我是一个使用存储过程的新手,我真的遇到了瓶颈。我在使用Spring JdbcTemplate时收到了以下错误消息。我的开发环境是Xubuntu,jdk 1.8。

堆栈跟踪为:

Exception in thread "main" org.springframework.dao.InvalidDataAccessApiUsageException: Unable to determine the correct call signature - no procedure/function/signature for 'PROCONEINPARAMETER'
  at org.springframework.jdbc.core.metadata.GenericCallMetaDataProvider.processProcedureColumns(GenericCallMetaDataProvider.java:347)
  at org.springframework.jdbc.core.metadata.GenericCallMetaDataProvider.initializeWithProcedureColumnMetaData(GenericCallMetaDataProvider.java:112)
  at org.springframework.jdbc.core.metadata.CallMetaDataProviderFactory$1.processMetaData(CallMetaDataProviderFactory.java:133)
  at org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:299)
  at org.springframework.jdbc.core.metadata.CallMetaDataProviderFactory.createMetaDataProvider(CallMetaDataProviderFactory.java:73)
  at org.springframework.jdbc.core.metadata.CallMetaDataContext.initializeMetaData(CallMetaDataContext.java:286)
  at org.springframework.jdbc.core.simple.AbstractJdbcCall.compileInternal(AbstractJdbcCall.java:303)
  at org.springframework.jdbc.core.simple.AbstractJdbcCall.compile(AbstractJdbcCall.java:288)
  at org.springframework.jdbc.core.simple.AbstractJdbcCall.checkCompiled(AbstractJdbcCall.java:348)
  at org.springframework.jdbc.core.simple.AbstractJdbcCall.doExecute(AbstractJdbcCall.java:375)
  at org.springframework.jdbc.core.simple.SimpleJdbcCall.executeFunction(SimpleJdbcCall.java:153)
  at test.jdbc.StringDao.executeProcOneINParameter(StringDao.java:21)
  at test.jdbc.SimpleJdbcTest.main(SimpleJdbcTest.java:15)

代码:

网站SimpleJdbc.java

package test.jdbc;
import java.util.Map;

import org.springframework.context.ApplicationContext;  
import org.springframework.context.support.ClassPathXmlApplicationContext;  
public class SimpleJdbcTest {


    public static void main(String[] args) {  
        ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");  
           StringDao dao=(StringDao)ctx.getBean("edao");  
        String request = new String(" Wow, this works!");

        String response = dao.executeProcOneINParameter(request);  
        if (response != null && !response.equals(new String())) {
            System.out.println("stored proc worked: "+ response);

        } else {
            System.err.println("stored proc did not work.");
        }
    }  

}

网站StringDao.java

package test.jdbc;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.simple.SimpleJdbcCall;

public class StringDao {

    private static final String PROC_NAME = "PROCONEINPARAMETER";
    private static final String CAT_NAME = "LISTENER";
    private JdbcTemplate jdbcTemplate;

    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    public String executeProcOneINParameter(String callParam){
        SimpleJdbcCall jdbcCall = new SimpleJdbcCall(jdbcTemplate)
                .withCatalogName(CAT_NAME)
                .withProcedureName(PROC_NAME);

        return jdbcCall.executeFunction(String.class, callParam);
    }

}

存储程序:

PROCONEINPARAMETER

CREATE OR REPLACE PROCEDURE procOneINParameter(param1 IN VARCHAR2)
IS
BEGIN

  DBMS_OUTPUT.PUT_LINE('Hello World IN parameter ' || param1);

END;
a6b3iqyw

a6b3iqyw1#

除了@Alex贴出的问题,我也纠正了,最后一个问题是:

static final String PROC_NAME = "PROCONEINPARAMETER";
private static final String CAT_NAME = "LISTENER";

…..
SimpleJdbcCall jdbcCall = new SimpleJdbcCall(jdbcTemplate)
            .withCatalogName(CAT_NAME)
            .withProcedureName(PROC_NAME);

而不是:

SimpleJdbcCall jdbcCall = new SimpleJdbcCall(jdbcTemplate)
            .withSchemaName(CAT_NAME)
            .withProcedureName(PROC_NAME);

显然,任何人都不可能知道我在交替使用目录和模式名称。

mpbci0fu

mpbci0fu2#

您试图调用一个过程,而不是函数。但是您是通过executeFunction()方法调用它的,并且指定了String的返回类型。
您需要使用execute()来代替,仍然传递过程参数,但没有返回类型(因为没有来自过程的返回类型):

Map<String,Object> out = jdbcCall.execute(callParam);

您的过程也没有任何OUT参数,因此out将为空。

fkaflof6

fkaflof63#

有类似的问题。
问题是:架构名称是大写的,所以它使用了双引号。例如:SchemaName为ABCD,而执行postgres时需要"ABCD"。
分辨率:已将架构名称转换为小写。

相关问题