如何将单个参数中的多个值传递给Informix 中的存储过程?。
这是一个常见问题,但我没有看到有关 informix 的信息。
我找到了一个帖子,但它对我不起作用,应该是数据库的版本还是我遗漏了什么?
我正在尝试执行此操作 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;
Run Code Online (Sandbox Code Playgroud)
我正在尝试执行它,但我认为我遇到了语法问题
EXECUTE PROCEDURE test_hector( '{stspols,stsrepo}');
Run Code Online (Sandbox Code Playgroud)
我收到错误消息 [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
Run Code Online (Sandbox Code Playgroud)
我正在使用Aqua Data Studio 8.0.22来创建和执行该过程。继续运行Windows 7 Ultimate 32-Bits
提前致谢。对于任何帮助
将参数类型定义为适当的集合类型:LIST、SET、MULTISET(这是我在交叉引用问题的答案中所说的)。
感谢您放大问题。你说:
Run Code Online (Sandbox Code Playgroud)EXECUTE PROCEDURE test_hector('{stspols,stsrepo}');我收到错误消息
[Informix][Informix ODBC Driver][Informix]Invalid collection literal value.
这可能比表面上看起来更容易解决。该过程的输入类型应该是一个集合——实际上是一个 SET 值的列表——其中每个值都是一个字符串。你可以这样写:
EXECUTE PROCEDURE test_hector(LIST{SET{'stspols','stsrepo'}});
Run Code Online (Sandbox Code Playgroud)
我为自己创建了一个虚拟程序来测试此语法:
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;
Run Code Online (Sandbox Code Playgroud)
它的输出正如预期的那样:
abc def ghi
Run Code Online (Sandbox Code Playgroud)
请注意,Informix 支持{由以下第一个开始和结束的注释样式}。但是,当 之前的关键字{是 SET、MULTISET 或 LIST 之一时,注释样式会被抑制(是的,这确实很难解析!)。您可以{}在不改变其含义的情况下通过“您可以在上面的 SQL 中的何处添加”获得巨大的(如果变态)乐趣。API 可能会识别 Informix{}注释但不识别集合异常。在这种情况下,您可能会返回一个语法错误(因为}如果您将第{一个解释为开始注释符号,则不会出现第二个)。在这种情况下,请使用以下符号之一。
集合(SET、MULTISET、LIST)文字的表示法随着时间的推移而演变。这种替代符号也有效(并且与您最初尝试的内容更密切相关,并且是最初记录的内容):
EXECUTE PROCEDURE test_hector('LIST{SET{''stspols'',''stsrepo''}}');
Run Code Online (Sandbox Code Playgroud)
SET 中的字符串必须用引号括起来,但整个文字本身就是一个字符串,因此您需要将嵌入的引号加倍。您也可以“作弊”并使用双引号和单引号:
EXECUTE PROCEDURE test_hector('LIST{SET{"stspols","stsrepo"}}');
EXECUTE PROCEDURE test_hector("LIST{SET{'stspols','stsrepo'}}");
Run Code Online (Sandbox Code Playgroud)
从下面的讨论以及替代答案中的描述来看,问题现在似乎与嵌套集合有关。ALIST{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;
Run Code Online (Sandbox Code Playgroud)
我能够执行以下两个语句,并显示结果:
+ EXECUTE PROCEDURE test_3(SET{'stspols','stsrepo'});
stspols
stsrepo
+ EXECUTE PROCEDURE test_3('SET{''stspols'',''stsrepo''}');
stspols
stsrepo
Run Code Online (Sandbox Code Playgroud)
这是使用 ESQL/C 接口。您应该能够让第二个使用 ODBC;第一个可能会导致 -201 语法错误。
如果您更喜欢 LIST 到 SET,那么在上面的代码中将 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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
17118 次 |
| 最近记录: |