我需要调用以表形式返回对象类型的PL / SQL函数。 基本上像:

select * from TABLE(get_druck_variablen(123456);

到目前为止,在JOOQ im中使用本机查询,它可以正常工作:

final Result<Record> result = create.fetch("select * from TABLE(myschema.get_druck_variablen(" + id + "))");

但是我想在JOOQ中正确地做。

1)我来到这里:

final GetDruckVariablen getDruckVariablen = new GetDruckVariablen();
getDruckVariablen.setPId(id);
getDruckVariablen.execute(); 

但是后来我得到了这个例外

Method threw 'java.lang.NullPointerException' exception. Cannot evaluate de.company.jooq.routines.GetDruckVariablen.toString() 

2)然后我尝试了这个:

  final TabOtDruckVariablenRecord getDruckVariablen = Routines.getDruckVariablen(create.configuration(), id).;

然后我得到了这个例外:

Caused by: org.springframework.jdbc.BadSqlGrammarException: jOOQ; bad SQL grammar [select "array_table"."COLUMN_VALUE" from table ("MYSCHEMA"."GET_DRUCK_VARIABLEN"(?)) "array_table"]; nested exception is java.sql.SQLSyntaxErrorException: ORA-00904: "array_table"."COLUMN_VALUE": ungültiger Bezeichner 

有关信息,这是我的PL / SQL函数:

create or replace FUNCTION      get_druck_variablen(p_id IN vk_types.t_id) RETURN myschema.tab_ot_druck_variablen 
PIPELINED 
IS 
....
BEGIN 
END get_druck_variablen; 

对象类型:

create or replace TYPE      ot_druck_variablen FORCE AS OBJECT 
( 
  ob_id   NUMBER(9, 0), 
  ob_txv_name VARCHAR2(100), 
  ob_txv_wert VARCHAR2(2000) 
)

表格类型:

create or replace TYPE      tab_ot_druck_variablen AS TABLE OF myschema.ot_druck_variablen 

我真的希望有人能帮助我。

提前致谢。

最好的祝福

伊万


添加了放样轨迹以解决以下问题:

    final GetDruckVariablen getDruckVariablen = new GetDruckVariablen();
    getDruckVariablen.setPId(id);
    getDruckVariablen.execute(dslContext.configuration()); 

堆栈跟踪:

      2017-08-16 22:25:16.039 ERROR 4928 --- [  restartedMain] o.s.boot.SpringApplication               : Application startup failed 

      java.lang.IllegalStateException: Failed to execute CommandLineRunner 
            at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:735) 
            at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:716) 
            at org.springframework.boot.SpringApplication.afterRefresh(SpringApplication.java:703) 
            at org.springframework.boot.SpringApplication.run(SpringApplication.java:304) 
            at org.springframework.boot.SpringApplication.run(SpringApplication.java:1118) 
            at org.springframework.boot.SpringApplication.run(SpringApplication.java:1107) 
            at de.mycompany.druckauftrag.DruckAuftragApplication.main(DruckAuftragApplication.java:31) 
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
            at java.lang.reflect.Method.invoke(Method.java:498) 
            at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) 
      Caused by: org.springframework.jdbc.BadSqlGrammarException: jOOQ; bad SQL grammar [select "array_table"."COLUMN_VALUE" from table ("MYSCHEMA"."GET_DRUCK_VARIABLEN"(?)) "array_table"]; nested exception is java.sql.SQLSyntaxErrorException: ORA-00904: "array_table"."COLUMN_VALUE": ungültiger Bezeichner 

            at org.jooq_3.9.3.ORACLE.debug(Unknown Source) 
            at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:231) 
            at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73) 
            at org.springframework.boot.autoconfigure.jooq.JooqExceptionTranslator.translate(JooqExceptionTranslator.java:92) 
            at org.springframework.boot.autoconfigure.jooq.JooqExceptionTranslator.handle(JooqExceptionTranslator.java:81) 
            at org.springframework.boot.autoconfigure.jooq.JooqExceptionTranslator.exception(JooqExceptionTranslator.java:54) 
            at org.jooq.impl.ExecuteListeners.exception(ExecuteListeners.java:245) 
            at org.jooq.impl.AbstractQuery.execute(AbstractQuery.java:364) 
            at org.jooq.impl.AbstractResultQuery.fetch(AbstractResultQuery.java:315) 
            at org.jooq.impl.SelectImpl.fetch(SelectImpl.java:2708) 
            at org.jooq.impl.AbstractRoutine.executeSelectFromOracle(AbstractRoutine.java:362) 
            at org.jooq.impl.AbstractRoutine.execute(AbstractRoutine.java:318) 
            at org.jooq.impl.AbstractRoutine.execute(AbstractRoutine.java:287) 
            at de.mycompany.druckauftrag.container.cask.KfzParam.getDruckVariablen(KfzParam.java:59) 
            at de.mycompany.druckauftrag.container.cask.KfzParam.befuelleVariablen(KfzParam.java:36) 
            at de.mycompany.druckauftrag.service.DokumentService.erzeugeDokument(DokumentService.java:55) 
            at de.mycompany.druckauftrag.service.XmlCreator.createXml(XmlCreator.java:33) 
            at de.mycompany.druckauftrag.DruckAuftragApplication.run(DruckAuftragApplication.java:46) 
            at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:732) 
            ... 11 common frames omitted 
      Caused by: java.sql.SQLSyntaxErrorException: ORA-00904: "array_table"."COLUMN_VALUE": ungültiger Bezeichner 

            at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:450) 
            at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:399) 
            at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1059) 
            at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:522) 
            at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:257) 
            at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:587) 
            at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:225) 
            at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:53) 
            at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:774) 
            at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:925) 
            at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1111) 
            at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:4798) 
            at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:4901) 
            at oracle.jdbc.driver.OraclePreparedStatementWrapper.execute(OraclePreparedStatementWrapper.java:1385) 
            at sun.reflect.GeneratedMethodAccessor62.invoke(Unknown Source) 
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
            at java.lang.reflect.Method.invoke(Method.java:498) 
            at org.apache.tomcat.jdbc.pool.StatementFacade$StatementProxy.invoke(StatementFacade.java:114) 
            at com.sun.proxy.$Proxy94.execute(Unknown Source) 
            at org.jooq.tools.jdbc.DefaultPreparedStatement.execute(DefaultPreparedStatement.java:195) 
            at org.jooq.impl.AbstractResultQuery.execute(AbstractResultQuery.java:270) 
            at org.jooq.impl.AbstractQuery.execute(AbstractQuery.java:349) 
            ... 22 common frames omitted

#1楼 票数:1 已采纳

我怀疑您遇到了一个错误(目前可能已修复)。 知道您使用的是哪个jOOQ版本后,我将通过指向相关GitHub问题的链接来更新答案。

关于1)和NullPointerException

您尝试进行NPE的可能原因1):

final GetDruckVariablen getDruckVariablen = new GetDruckVariablen();
getDruckVariablen.setPId(id);
getDruckVariablen.execute(); 

...可能是您没有将Configuration传递给execute()方法的事实。 “少Configuration方法假定您的常规调用先前已“附加”到Configuration 但最好将其明确传递:

getDruckVariablen.execute(configuration); 

关于本机查询用法的旁注:

您肯定知道这一点,但我必须为以后的读者提一下。 使用jOOQ普通SQL API不仅会给游标缓存带来压力,还会带来SQL注入的一定风险:

final Result<Record> result = create.fetch(
  "select * from TABLE(myschema.get_druck_variablen(" + id + "))");

最好使用绑定变量,这对于普通SQL也是完全可行的:

final Result<Record> result = create.fetch(
  "select * from TABLE(myschema.get_druck_variablen(?))", id);

  ask by Ivancodescratch translate from so

未解决问题?本站智能推荐:

2回复

使用jOOQ执行PL / SQL函数时的Java空指针

我目前正在尝试调用接受多个输入/输出参数的PL / SQL函数。 此函数包含以下数据类型: 串。 字符串数组。 但是,当应用程序设置数据以将其发送到数据库服务器时,应用程序抛出一个空指针异常,这与实际的错误无关 (请注意,实际错误在下面给出,因为在调试时已经找到了应用
1回复

如何在JOOQ中使用toChar函数?

我必须使用toChar()函数JOOQ ? 现在我使用下面的代码 我必须转换成JOOQ 。 如何在JOOQ使用它?
1回复

如何在带有jooq的普通sql中使用命名参数

我将 JOOQ 与普通/原始 SQL 一起使用,这意味着我没有使用任何代码生成或流畅的 DSL 东西。 以下代码有效: Connection connection = ...; DSLContext context = DSL.using(connection, ...); String sql
1回复

如何在jooq中使用mysql SEC_TO_TIME函数

MYSQL: Jooq最近被使用过,但我不知道如何将SEC_TO_TIME与jooq一起使用 请帮我
1回复

如何在Jooq中使用SelfJoin?

我们可以在JOOQ中使用SelfJoin吗? Select Count(1) CountPayments From PaymentDetail APD1, PaymentDetail APD2, Payment AP where APD1.PaymentNumber =123 and
1回复

在 JOOQ 的选择中使用 UNNEST

我有这样的 SQL: select * from some_table where (select array(select unnest(first_array_field) except select unnest(second_array_field))) @> '{some_value
1回复

如何在JOOQ中使用@variable?

我正在尝试实现类似以下Jooq中的MySql查询的功能: 我们如何在JOOQ中使用@variable? 注意:我知道JOOQ中CASE WHEN的等效项,但只想知道@variable。 Jooq版本:3.0.1
1回复

如何在 JOOQ 中公开新的 SQL 函数

我想使用REGEXP_REPLACE sql 函数(我的目标是 Postgres),但是在快速检查REGEXP_REPLACE的DSL类后,它似乎尚未公开。 我应该如何处理添加新功能的问题? 我可以尝试扩展AbstractFunction ,类似于org.jooq.impl.Replace