Informix:如何将单个参数中的多个值传递、使用和执行到存储过程

2024-02-02

如何将单个参数中的多个值传递给存储过程Informix?.

这是一个常见的问题,但我没有看到任何关于 informix 的信息。

我找到了一个post http://www.mombu.com/programming/informix/t-pass-multiple-values-in-a-single-parameter-in-informix-stored-procedure-1512924.html,但它对我不起作用,应该是数据库的版本还是我遗漏了什么?

我正在尝试执行此操作WHERE X IN (SELECT Y FROM TABLE(PARAM))

Edit:

这是我正在尝试做的一个例子。

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;

我正在尝试执行它,但我认为我遇到了语法问题

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

提前致谢。如需任何帮助


将参数类型定义为适当的集合类型: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''}}');

SET 中的字符串必须用引号括起来,但整个文字本身就是一个字符串,因此您需要将嵌入的引号加倍。您还可以“作弊”并使用双引号和单引号:

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

从下面的讨论以及替代答案中的描述来看,问题现在似乎与嵌套集合有关。 ALIST{SET{"str1", "str2"}}是一个有序列表(其中有一个条目);该条目本身是一组(不同的)字符串,没有特定的顺序。如果您需要能够重复字符串(但顺序并不重要),您可以使用 MULTISET。您使用列表是因为顺序很重要(并且列表中允许重复)。

听起来好像你真的只需要选择参数类型,这样就更简单了。您应该能够有效地使用任何一种集合类型;我可能会提名 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,请在上面的代码中将 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Informix:如何将单个参数中的多个值传递、使用和执行到存储过程 的相关文章

  • play20 ebean 生成的 sql 在 postgresql 上抛出语法错误

    我正在尝试使用 postgresql 来启动我的 play20 应用程序 以便我可以使用并稍后部署到 Heroku 我跟着这个answer https stackoverflow com questions 12195568 errors
  • SQL:比较不同表中的两个计数

    我有 3 张桌子 一张桌子上有世界上每个国家及其代币 NAME CODE Afghanistan AFG Albania AL Algeria DZ American Samoa AMSA Andorra AND Angola ANG An
  • Oracle 获取列值发生变化的行

    假设我有一张桌子 比如 ID CCTR DATE 1 2C 8 1 2018 2 2C 7 2 2018 3 2C 5 4 2017 4 2B 3 2 2017 5 2B 1 1 2017 6 UC 11 23 2016 还有其他字段 但我
  • 返回行位置 - Postgres

    我返回一个带有位置的表 select from select row number over as position from organization result where data1 Hello 返回这个 这是正确的 data1 H
  • 如何在SQL Server数据库表列中存储图像[重复]

    这个问题在这里已经有答案了 我有一张名为FEMALE在我的数据库中 它有ID as Primary Key 它有一个Image column 我的问题是如何使用 SQL 查询存储图像 尝试一下 insert into tableName I
  • 显示过去 7 天 PHP 的结果

    我想做的是显示过去 30 天的文章 但我现有的代码不断给我一个 mysql fetch assoc 错误 然后追溯到我的查询 这是代码 sql mysql query SELECT FROM table WHERE DATE datetim
  • SQL Server 查询结果集的大小

    SQL Server 中是否有确定结果集中 Mgmt Studio 查询中返回的数据大小 以 MEGS 为单位 您可以打开客户端统计信息 查询菜单 包括客户端统计信息 它给出执行查询时从服务器返回的字节数
  • 是否允许在流水线 PL/SQL 表函数中使用 SELECT?

    管道函数的文档指出 在 SQL 语句 通常是SELECT 并且在大多数示例中 管道函数用于数据生成或转换 接受客户作为参数 但不发出任何 DML 语句 现在 从技术上讲 可以使用 SELECT 而不会出现 Oracle 中的任何错误 ORA
  • 如果执行没有事务的删除语句,是否会删除部分内容?

    如果表myTable包含100000000条记录 我执行DELETE FROM myTable 没有开始交易并且出现问题 例如服务器电源故障 会删除一些记录吗 否 如果数据库引擎符合ACID http en wikipedia org wi
  • 更新plpgsql中触发器函数中的多列

    给出以下架构 create table account type a id SERIAL UNIQUE PRIMARY KEY some column VARCHAR create table account type b id SERIA
  • SQL Group BY,每个组的前 N ​​个项目

    我有一个 SQL 查询 可以获取给定商店中销量最高的 5 件商品 SELECT TOP 5 S UPCCode SUM TotalDollarSales FROM Sales S WHERE S StoreId 1 GROUP BY S U
  • 外键引用多个表

    我有4张桌子 A ida name B ida B specific stuff C ida C specific stuff D ida D specific stuff 我希望另一个表 E 可以仅引用 B 或 C 而不是 D 我可以在其
  • 累计非重复计数

    我正在查询每天获取 uid 的累计不同计数 示例 假设有 2 个 uid 100 200 出现在日期 2016 11 01 并且它们也在第二天出现 新的 uid 300 100 200 300 出现在 2016 11 02 此时我希望商店累
  • SQL:查找每个跑步者跑步之间的平均天数

    因此 如果我们给出下表 runner ran Carol 2011 02 01 Alice 2011 02 01 Bob 2011 02 01 Carol 2011 02 02 Bob 2011 02 02 Bob 2011 02 03 B
  • 从一个sql服务器选择到另一个sql服务器?

    我想将一台服务器 Data Old S1 中的一个表 T1 在 DB1 中 中的数据选择到另一台服务器 Data Latest S2 中的另一个表 T2 在 DB2 中 中的数据 我怎样才能做到这一点 请注意服务器的命名方式 查询也应该考虑
  • ORA-01749: 您不能向自己授予/撤销权限

    我正在运行以下查询RATOR MONITORING授予引用权限的架构RATOR MONITORING CONFIGURATION SMSC GATEWAY表到RATOR MONITORING schema GRANT REFERENCES
  • 使用 xmlagg 时出现子查询错误和太多值

    我在连接许多大型表中的所有数据时遇到问题 我昨天对此提出了问题 但不幸的是 listagg 似乎不是一个好的选择 链接子查询返回多行 https stackoverflow com questions 54651144 subquery r
  • SQL 插入失败 - 违反主键约束

    我在 SQL Insert 语句中看到一个非常奇怪的问题 我有一个简单的表 带有一个 ID 和 2 个日期时间 请参阅下面的创建脚本 CREATE TABLE dbo DATA POPULATION LOGS ID int IDENTITY
  • ActiveRecord 嵌套 SELECT——我可以在没有手动 SQL 的情况下完成它吗?

    我有一张桌子 上面有 除其他外 一个名字和一个等级 我想返回所有唯一名称的集合 但对于返回的每个名称 我想选择排名最高的行 这很简单 有两个嵌套的 SELECT 语句 SELECT FROM SELECT FROM foo ORDER BY
  • 按两列的最小值排序

    I use SQL Server 2008 R2 我需要按两列的最小值对表进行排序 该表如下所示 ID integer Date1 datetime Date2 datetime 我希望我的数据按至少两个日期排序 以这种方式对该表进行排序的

随机推荐