簡體   English   中英

Informix:如何在單個參數中傳遞,使用和執行多個值到存儲過程

[英]Informix: How to pass, use and execute multiple values in a single parameter to a stored procedure

我如何將單個參數中的多個值傳遞給Informix中的存儲過程?

這是一個經常出現的問題,但我看到了關於informix的noyhing。

我發現了一個帖子 ,但它對我不起作用,應該是DB的版本還是我錯過了什么?

我正在嘗試執行WHERE X IN (SELECT Y FROM TABLE(PARAM))

編輯:

這是我想要做的一個例子。

CREATE PROCEDURE test_hector
(
    C LIST( SET (CHAR(10) NOT NULL ) NOT NULL)
)
RETURNING CHAR(10) AS C, CHAR(10) AS CVE, CHAR(50) AS DESC;

DEFINE vColumna like tclaves.columna;
DEFINE vClave like tclaves.clave;
DEFINE vdescve like tclaves.descve;

FOREACH
select columna, clave, descve
INTO vColumna, vClave,vdescve
from tclaves
where columna in (SELECT * FROM TABLE(C))
RETURN vColumna, vClave,vdescve WITH RESUME;
END FOREACH
END PROCEDURE;

我正在嘗試執行它,但我認為我有sintax問題

EXECUTE PROCEDURE test_hector( '{stspols,stsrepo}');

我收到錯誤消息[Informix][Informix ODBC Driver][Informix]Invalid collection literal value.

我執行了這個函數execute function se_release()來獲取informix版本,這就是我得到的。

column1
Spatial DataBlade Release 8.21.FC4R1 (Build 238)                 Compiled on Thu Aug 26 19:42:55 CDT 2010 with:                      IBM Informix Dynamic Server Version 10.00.FC7                    glslib-4.00.UC10

我正在使用Aqua Data Studio 8.0.22來創建和執行該過程。 Windows 7 Ultimate 32-Bits上運行Runinng

提前致謝。 任何幫助

將參數類型定義為適當的集合類型:LIST,SET,MULTISET(這是我在交叉引用問題的答案中所說的)。

  • 什么不適合你?
  • 你嘗試了什么?
  • 你得到的錯誤信息是什么?
  • 您使用的是哪個版本的Informix服務器?
  • 您使用哪個工具或API來創建存儲過程?
  • 您使用哪個工具或API來執行存儲過程?
  • 你在哪個平台上運行?
  • 你是如何調用這個程序的?

謝謝你們放大了這個問題。 你說:

 EXECUTE PROCEDURE test_hector('{stspols,stsrepo}'); 

我收到錯誤消息[Informix][Informix ODBC Driver][Informix]Invalid collection literal value.

這可能是一個比表面上看起來更簡單的問題。 過程的輸入類型應該是一個集合 - 實際上是SET值的LIST - 其中每個值都是一個字符串。 你可以這樣寫:

EXECUTE PROCEDURE test_hector(LIST{SET{'stspols','stsrepo'}});

我創建了一個虛擬過程來測試這種語法:

CREATE PROCEDURE test_hector(c LIST(SET (CHAR(10) NOT NULL ) NOT NULL))
    RETURNING CHAR(10) AS C, CHAR(10) AS CVE, CHAR(50) AS DESC;
    return "abc", "def", "ghi";
END PROCEDURE;

它的輸出符合預期:

abc   def   ghi

請注意,Informix支持由{開始的注釋樣式,並由第一個以后結束} 但是,當{之前的關鍵字是SET,MULTISET或LIST之一時,該注釋樣式被抑制(是的,這確實使得它很難解析!)。 你可以擁有巨大的(如果變態)有趣的“你可以在上面的SQL中添加{} ”,而不會改變它的含義。 API可能會識別Informix {}注釋,但無法識別集合異常。 在這種情況下,您可能會收到語法錯誤(因為如果您將第一個{解釋為開始注釋符號),則不會出現第二個} 在這種情況下,請使用以下符號之一。

收集符號(SET,MULTISET,LIST)隨着時間的推移逐漸演變。 這種替代符號也有效(並且與您最初嘗試的內容更緊密相關,並且是最初記錄的內容):

EXECUTE PROCEDURE test_hector('LIST{SET{''stspols'',''stsrepo''}}');

SET中的字符串必須用引號括起來,但整個文字本身就是一個字符串,所以你需要加倍嵌入的引號。 你也可以“欺騙”並使用雙引號和單引號:

EXECUTE PROCEDURE test_hector('LIST{SET{"stspols","stsrepo"}}');
EXECUTE PROCEDURE test_hector("LIST{SET{'stspols','stsrepo'}}");

從下面的討論開始,如替代答案中所述,現在問題似乎與嵌套集合有關。 LIST{SET{"str1", "str2"}}是一個有序列表(其中有一個條目); 該條目本身是一組(不同的)字符串,沒有特定的順序。 如果你需要能夠重復字符串(但順序並不重要),你可以使用MULTISET。 您使用LIST是訂單很重要(並且列表中允許重復)。

聽起來好像你真的只需要選擇參數類型以便它更簡單。 您應該能夠有效地使用任何一種集合類型; 我可能會提名SET,這樣你就不必處理列表中重復的字符串,但MULTISET或LIST也是有效的選項。 將過程重命名為test_3()

CREATE PROCEDURE test_3(c SET(CHAR(10) NOT NULL))
    RETURNING CHAR(10) AS r;
    DEFINE r CHAR(10);
    FOREACH SELECT * INTO r FROM TABLE(c)
        RETURN r WITH RESUME;
    END FOREACH;
END PROCEDURE;

我能夠執行以下兩個語句,結果顯示:

+ EXECUTE PROCEDURE test_3(SET{'stspols','stsrepo'});
stspols
stsrepo
+ EXECUTE PROCEDURE test_3('SET{''stspols'',''stsrepo''}');
stspols
stsrepo

這是使用ESQL / C接口。 你應該能夠得到第二個使用ODBC; 第一個可能會導致-201語法錯誤。

如果您更喜歡LIST設置,請在上面的代碼中將SET更改為LIST:

+ CREATE PROCEDURE test_3(c LIST(CHAR(10) NOT NULL))
    RETURNING CHAR(10) AS r;
    DEFINE r CHAR(10);
    FOREACH SELECT * INTO r FROM TABLE(c)
        RETURN r WITH RESUME;
    END FOREACH;
END PROCEDURE;
+ EXECUTE PROCEDURE test_3(LIST{'stspols','stsrepo'});
stspols
stsrepo
+ EXECUTE PROCEDURE test_3('LIST{''stspols'',''stsrepo''}');
stspols
stsrepo

我以不同的方式嘗試了它並找到了解決方案。

我修改過程接受一個參數就像一個List ,而不是List{SET...

CREATE PROCEDURE test_hector
(
    C LIST( CHAR(10) NOT NULL )
)
RETURNING CHAR(10) AS C, CHAR(10) AS CVE, CHAR(50) AS DESC;

DEFINE vColumna like tclaves.columna;
DEFINE vClave like tclaves.clave;
DEFINE vdescve like tclaves.descve;

FOREACH
select columna, clave, descve
INTO vColumna, vClave,vdescve
from tclaves
where columna in (SELECT * FROM TABLE(C))
RETURN vColumna, vClave,vdescve WITH RESUME;
END FOREACH
END PROCEDURE;

並以這種方式執行它。

EXECUTE PROCEDURE test_hector('LIST{''stspols'',''stsrepo''}');

或者這樣

EXECUTE PROCEDURE test_hector3('LIST{"stspols","stsrepo"}');

它就像一個魅力。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM