2011-03-31 50 views
1

很簡單 - 有沒有一種方法可以使用此庫調用存儲過程或函數,並返回多個結果?我瞭解ITRoutingManager,但它似乎只返回一個值..使用用於C++的Informix對象接口用於帶有參數的存儲過程/函數

在細節,這裏就是我的意思:

CREATE FUNCTION test_out1(pin INT) 
    RETURNING INT; 

    DEFINE param INT; 
    LET param = 321; 

    RETURN param; 

END FUNCTION;

返回321,我可以ITValueITConversions獲得的價值。所以這很好。但是,下面是不是:

CREATE FUNCTION test_out2(pin INT) 
    RETURNING INT, INT; 

    DEFINE param INT; 
    LET param = 321; 

    DEFINE param2 INT; 
    LET param2 = 123; 

    RETURN param, param2; 

END FUNCTION;

當我做routine.GetRoutine("function test_out2(int)"),它必將很好,所以沒有這一問題。但看到這一點:

std::cout << "Result type: " << routine.ResultType()->Name() IsRow() ? "row, " : ", ") 
     << (routine.ResultType()->IsCollection() ? "collection, " : ", ") 
     << routine.ResultType()->Quality() << "\n\n";

打印integer, , , null注意整數。爲什麼是整數,不能行,例如。和如何獲取2個值,由函數返回?另一個有趣的事實 - 返回值爲0 (當我將其轉換爲int,使用ITConversions類),而不是123,也不是321 ..

有必須的一種方式。這是Informix開發人員爲Informix服務器編寫的一個特殊庫,如果這不可能,那將會很奇怪。

同樣的功能,但我想它是一樣的。


注:有沒有這樣的事情在通常情況下作爲輸出參數,爲Informix過程/函數(Informix: procedure with output parameters?

+0

您高估了OIC++軟件包的效用。它是使用宏而不是模板編寫的古老的預標準C++。自從它在1996年寫成以來,它並沒有被認真修改過 - 幾年前得到了一些清理,因此編譯器的投訴減少了。請注意'投訴少' - 不是'沒有投訴'。我不會推薦它用於新代碼。 – 2011-03-31 15:20:05

+0

@Jonathan Leffler - 我的另一種選擇是使用ODBC驅動程序,它對Informix服務器來說非常合適。我想使用OIC++軟件包,因爲它僅用於Informix,因此我預計它會更快(適用​​於負載非常高的實時系統)。但它似乎**甚至更慢**,除了當使用ITRoutineManager時 - 那麼,通過這個類,性能**好兩倍**。但是,只有那麼..所以,請問,請指教?我猜ODBC會是更好的選擇?提前感謝! – 2011-03-31 15:35:22

+0

我在說unixODBC,忘了提。我在您的個人資料中看到了描述(「長時間使用Informix的用戶和開發人員,在C和Unix中經驗豐富」),我將非常感謝您的意見。 – 2011-03-31 15:37:40

回答

1

正如您注意,Informix的沒有「OUT」參數真的;它返回值。

在常規的ESQL/C中,您會使用輸入值列表對稱地處理輸出值列表;因此,我希望對此代碼也做同樣的事情。無論使用哪種技術將2個參數傳遞給該函數都可能 - 但決不是保證 - 就是如何獲得多個返回的值。

如有疑問,請把它當作對待一個返回多行的SELECT語句。也就是說,做的類似物:

PREPARE s FROM "EXECUTE PROCEDURE test_out2(?)"; 
DECLARE c CURSOR FOR s; 
OPEN c USING :input_value; 
while (sqlca.sqlcode == 0) 
{ 
    FETCH c INTO :out_value1, :out_value2; 
    if (sqlca.sqlcode != 0) 
     break; 
    ...use values... 
} 
CLOSE c; 
FREE c; 
FREE s; 

我會建議使用ODBC在伊斯蘭會議組織++。 OIC++接口建立在另一個庫DMI之上,DMI又建立在另一個訪問DBMS的庫的頂部 - 我忘記它是基於ESQL/C還是ODBC,還是建立在其上的核心庫之一。使用unixODBC作爲您的驅動程序管理器和合適的ODBC驅動程序比使用OIC++更有意義。


我沒有真正的想法如何看起來在OIC++;我從來沒有使用它,但只做了一些粗略的維護。

總體而言,您最好不要使用OIC++進行新的工作。 Informix繼續分發它以實現向後兼容,而不是鼓勵新的使用。

+0

是的,這很好,但是使用'ITRoutineManager'類的速度要慢兩倍,然後真的更好使用ODBC。 – 2011-03-31 20:43:08

+0

Now我可以證實,ODBC的速度更快,並且OIC++構建在DQL的頂部,DMI構建在ESQL/C(: – 2011-04-05 10:00:23

相關問題