2015-02-07 56 views
0

表值PostgreSQL函數獲取結果我有一個PostgreSQL函數返回表從JOOQ

CREATE OR REPLACE FUNCTION test_func(IN param1 text, IN param2 integer) 
    RETURNS TABLE(result1 text, result2 integer) AS 
    $BODY$ 
    BEGIN 
    result1 := 'aa'; 
    result2 :=1; 
    return next; 
    result1 := 'bb'; 
    result2 :=2; 
    return next; 
    END 
    $BODY$ 
    LANGUAGE plpgsql 

查詢在PG-管理員返回正確的結果

select * from test_func('aaa', 23); 
result1 | result2 
"aa" | 1 
"bb" | 2 

JOOQ產生一如既往

功能
... 
public class TestFunc extends org.jooq.impl.AbstractRoutine<java.lang.Void> { 
... 
public TestFunc() { 
    super("test_func", ee.tavex.tavexwise.db.public_.Public.PUBLIC); 

    addInParameter(PARAM1); 
    addInParameter(PARAM2); 
    addOutParameter(RESULT1); 
    addOutParameter(RESULT2); 
} 
... 

and in routine例如

... 
public static ee.tavex.tavexwise.db.public_.routines.TestFunc testFunc(org.jooq.Configuration configuration, java.lang.String param1, java.lang.Integer param2) { 
    ee.tavex.tavexwise.db.public_.routines.TestFunc p = new ee.tavex.tavexwise.db.public_.routines.TestFunc(); 
    p.setParam1(param1); 
    p.setParam2(param2); 

    p.execute(configuration); 
    return p; 
} 

我把它叫做這樣

TestFunc records = Routines.testFunc(dslConfiguration, "xx", 10); 


records.getResults() //returns empty List 
records.getResult1() //returns "aa" 
records.getResult2() //returns 1 

所以,正確地返回第一行的值,但我怎麼能得到整個表?

(jooq 3.5.0)

+0

不,我正在嘗試使用JOOQ renerated例程進行請求。現在生成的函數與我得到的函數完全相同,當函數只返回一個記錄時。我無法獲得此處描述的結果http://www.jooq.org/doc/3.5/manual/sql-building/table-expressions/table-valued-functions/ – 2015-02-08 14:23:35

+0

@ user693442:您能否顯示您的jOOQ代碼'正在使用?你是否也可以展示函數體,只是爲了確保那裏沒有錯? – 2015-02-08 16:24:46

+0

更新了問題 – 2015-02-08 17:48:37

回答

1

正確的方法來調用表值函數從jOOQ是在FROM條款as documented in the manual page您連結使用它們。

在你的情況,這將是:

Result<TestFuncRecord> result = 
DSL.using(configuration) 
    .selectFrom(Routines.testFunc("xx", 10)) 
    .fetch(); 

或者與jOOQ 3.6開始也

Result<TestFuncRecord> result = 
DSL.using(configuration) 
    .selectFrom(Tables.TEST_FUNC("xx", 10)) 
    .fetch(); 

的jOOQ代碼生成器把表值函數像普通的表,不喜歡的套路。這就是爲什麼在Routines中不應該有方法,它需要一個Configuration參數。

+0

@ user693442感謝您接受它會更容易。你有什麼實際問題?即你發現什麼產生了「錯誤的」生成的例程? – 2015-02-10 14:11:56

+0

我的classpath中有幾個不同版本的jooq jar。 第二個問題是重載的表值過程。我發佈了一個單獨的問題,這個http://stackoverflow.com/questions/28434559/jooq-not-generating-table-valued-overloaded-procedures-from-postgresql – 2015-02-10 14:49:00

+0

@ user693442:嗯,是的,這肯定會導致問題.. 。 感謝您的反饋 – 2015-02-10 14:53:03