java - 如何从PreparedStatement调用sql函数?

标签 java spring postgresql jdbc

我正在使用 SpringPreparedStatement,并且想要准备 sql 以使用数据库的函数。但以下方法不起作用:

String sql = "SELECT somefunct(?,?)";

当我使用准备好的语句运行它时,我得到:

org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback; SQL [SELECT somefunct(?,?)]; Batch-Eintrag 0 SELECT somefunct('XX','XX') wurde abgebrochen.  Rufen Sie 'getNextException' auf, um die Ursache zu erfahren.; nested exception is java.sql.BatchUpdateException: Batch-Eintrag 0 SELECT somefunct('XX','XX') wurde abgebrochen.  Rufen Sie 'getNextException' auf, um die Ursache zu erfahren.
    at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:102)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:660)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:673)
    at org.springframework.batch.item.database.JdbcBatchItemWriter.write(JdbcBatchItemWriter.java:185)
    at org.springframework.batch.core.step.item.SimpleChunkProcessor.writeItems(SimpleChunkProcessor.java:175)
    at org.springframework.batch.core.step.item.FaultTolerantChunkProcessor.scan(FaultTolerantChunkProcessor.java:578)
    at org.springframework.batch.core.step.item.FaultTolerantChunkProcessor.access$900(FaultTolerantChunkProcessor.java:50)
    at org.springframework.batch.core.step.item.FaultTolerantChunkProcessor$5.recover(FaultTolerantChunkProcessor.java:410)
    at org.springframework.retry.support.RetryTemplate.handleRetryExhausted(RetryTemplate.java:458)
    at org.springframework.retry.support.RetryTemplate.doExecute(RetryTemplate.java:320)
    at org.springframework.retry.support.RetryTemplate.execute(RetryTemplate.java:193)
    at org.springframework.batch.core.step.item.BatchRetryTemplate.execute(BatchRetryTemplate.java:217)
    at org.springframework.batch.core.step.item.FaultTolerantChunkProcessor.write(FaultTolerantChunkProcessor.java:420)
    at org.springframework.batch.core.step.item.SimpleChunkProcessor.process(SimpleChunkProcessor.java:199)
    at org.springframework.batch.core.step.item.ChunkOrientedTasklet.execute(ChunkOrientedTasklet.java:75)
    at org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:406)
    at org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:330)
    at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:133)
    at org.springframework.batch.core.step.tasklet.TaskletStep$2.doInChunkContext(TaskletStep.java:271)
    at org.springframework.batch.core.scope.context.StepContextRepeatCallback.doInIteration(StepContextRepeatCallback.java:77)
    at org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:368)
    at org.springframework.batch.repeat.support.RepeatTemplate.executeInternal(RepeatTemplate.java:215)
    at org.springframework.batch.repeat.support.RepeatTemplate.iterate(RepeatTemplate.java:144)
    at org.springframework.batch.core.step.tasklet.TaskletStep.doExecute(TaskletStep.java:257)
    at org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:198)
    at org.springframework.batch.core.job.SimpleStepHandler.handleStep(SimpleStepHandler.java:148)
    at org.springframework.batch.core.job.AbstractJob.handleStep(AbstractJob.java:386)
    at org.springframework.batch.core.job.SimpleJob.doExecute(SimpleJob.java:135)
    at org.springframework.batch.core.job.AbstractJob.execute(AbstractJob.java:304)
    at org.springframework.batch.core.launch.support.SimpleJobLauncher$1.run(SimpleJobLauncher.java:135)
    at org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:50)
    at org.springframework.batch.core.launch.support.SimpleJobLauncher.run(SimpleJobLauncher.java:128)
    at org.springframework.boot.SpringApplication.runCommandLineRunners(SpringApplication.java:677)
    at org.springframework.boot.SpringApplication.afterRefresh(SpringApplication.java:695)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:322)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:961)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:950)
Caused by: java.sql.BatchUpdateException: Batch-Eintrag 0 SELECT somefunct('X','test') wurde abgebrochen.  Rufen Sie 'getNextException' auf, um die Ursache zu erfahren.
    at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2743)
    at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleResultRows(AbstractJdbc2Statement.java:2692)
    at org.postgresql.core.v3.QueryExecutorImpl$1.handleResultRows(QueryExecutorImpl.java:439)
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1853)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:405)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2892)
    at org.springframework.batch.item.database.JdbcBatchItemWriter$1.doInPreparedStatement(JdbcBatchItemWriter.java:192)
    at org.springframework.batch.item.database.JdbcBatchItemWriter$1.doInPreparedStatement(JdbcBatchItemWriter.java:185)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:644)
    ... 40 more

最佳答案

这可能有帮助:

 String callSQL = "{ ? = call db_function(?) }";

 CallableStatement statement = pConnection.prepareCall(callSQL);

 statement.registerOutParameter(1, Types.VARCHAR);
 statement.setString(2, param);

 statement.execute();

 String result = statement.getString(1);

其中pConnectionjava.sql.Connection

关于java - 如何从PreparedStatement调用sql函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27860245/

相关文章:

sql - 使用 LEFT JOIN 删除

SQL 可搜索缓存 - 高可扩展性

java - Sun 的 Java 包命名约定 : sun vs. com.sun

java - 如何将原始文件夹中的音频文件共享到社交应用程序?

java - 有没有办法在通过 Selenium 加载后将一些js添加到所有页面中?

java - 如何使用Apache Kafka实现 "Exactly once"kafka消费者?

spring - 我必须在我的应用程序中做什么才能接收付款? (java - Spring )

java - 无法实例化 Android 驱动程序 appium 1.8.1

java - Apache Tomcat 7 无法启动

postgresql - 如何将每个学生的申请数量限制为 3 个?