2012-05-30 70 views
1

如何將單個參數中的多個值傳遞給存儲過程InformixInformix:如何將單個參數中的多個值傳遞給存儲過程

這是一個常見的問題,但我已經看到noyhing關於Informix。

我發現了一個post,但它不工作對我來說,應該是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來創建和執行該過程。提前Runinng上Windows 7 Ultimate 32-Bits

感謝。對於任何幫助

回答

4

定義參數類型作爲適當的集合類型:LIST,SET,MULTISET(我的答案交叉引用的提問時說這是)。

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

感謝放大的問題。你說:

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

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

這可能是一個簡單的問題來解決比它出現在表面上。該過程的輸入類型應該是一個集合—實際上,一個SET值的列表—其中每個值都是一個字符串。你可以寫爲:

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''}}'); 

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

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

從下面的討論,如在備選答案中所述,現在的問題似乎涉及到嵌套集合。 A 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語法錯誤。

如果你喜歡列表框中設定,然後更改設置在上面的代碼清單:

+ 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 
+1

我編輯了我的問題來回答你的問題。在此先感謝您的幫助! –

+0

這樣寫'EXECUTE PROCEDURE test_hector(LIST {SET {'stspols','stsrepo'}});'throws'[Informix] [Informix ODBC Driver] [Informix]發生語法錯誤。 '。 Wriitten like this'執行程序test_hector('LIST {SET {''stspols'',''stsrepo''}}');'throws'[Informix] [Informix ODBC Driver] [Informix]尚未實現。對於集合,sqlerrm(= any,!= any,= all或!= all)'和這樣'執行程序test_hector('LIST {SET {「stspols」,「stsrepo」}}');'拋出'[Informix] [Informix ODBC驅動程序] [Informix]尚未實現。 sqlerrm(= any,!= any,= all,或者!=全部爲集合)':( –

+0

+1 btw的完整解釋。幾乎工作,我認爲我們缺少的東西 –

0

我試過了,以不同的方式,並找到了解決辦法。

我修改了程序,接受一個參數只是作爲一個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"}'); 

和它的工作就像一個魅力。

相關問題