Oracle 无程序/功能/签名
我在使用存储过程方面相对较新,而且我真的遇到了麻烦。我使用SpringJDBCTemplate收到以下错误消息。我的开发环境是Xubuntu,JDK1.8 堆栈跟踪是: 代码: SimpleJdbc.java StringDao.java 存储过程:Oracle 无程序/功能/签名,oracle,spring-jdbc,jdbctemplate,Oracle,Spring Jdbc,Jdbctemplate,我在使用存储过程方面相对较新,而且我真的遇到了麻烦。我使用SpringJDBCTemplate收到以下错误消息。我的开发环境是Xubuntu,JDK1.8 堆栈跟踪是: 代码: SimpleJdbc.java StringDao.java 存储过程: 您试图调用的是过程,而不是函数。但是您通过方法调用它,并指定返回类型String 您需要改为使用,仍然传递过程参数,但没有返回类型(因为过程中没有返回类型): Map out=jdbcCall.execute(callParam); 您的过程也没
您试图调用的是过程,而不是函数。但是您通过方法调用它,并指定返回类型
String
您需要改为使用,仍然传递过程参数,但没有返回类型(因为过程中没有返回类型):
Map out=jdbcCall.execute(callParam);
您的过程也没有任何OUT参数,因此
OUT
将为空。除了@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);
显然,任何人都无法知道我是在交替使用目录名和模式名。尽管这是一个转移视线的问题,但它让我找到了正确的答案。
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;
Map<String,Object> out = jdbcCall.execute(callParam);
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);