AS400创建带ARRAY输入参数的存储过程遇SQL0104错误求助
解决IBM i(AS400)创建数组参数存储过程的SQL0104错误
你的错误核心是数组类型的创建语法不符合IBM i SQL的规范,另外多语句批量执行时的分隔符处理也可能是隐藏坑。下面是具体的修正方案:
1. 修正数组类型的创建语法
IBM i SQL中,创建数组类型的正确逻辑是先指定数组的容量,再声明元素的数据类型,和你原来的写法顺序完全相反。修正后的CREATE TYPE语句如下:
CREATE TYPE ALI/stringArray AS ARRAY(100) OF VARCHAR(100);
建议加上明确的库名(比如
ALI/),避免类型被创建到默认库中,后续调用存储过程时出现找不到类型的问题。
2. 拆分执行语句(或设置正确的分隔符)
如果是在STRSQL这类交互式SQL环境中执行代码,默认的语句分隔符是分号,直接把CREATE TYPE和CREATE PROCEDURE放在同一段代码里执行会触发解析错误。推荐两种处理方式:
- 分步执行:先单独运行
CREATE TYPE语句,确认类型创建成功(可以用SELECT * FROM QSYS2.SYSTYPES WHERE TYPE_NAME = 'STRINGARRAY'验证),再执行存储过程的创建代码; - 修正后的存储过程代码:
CREATE PROCEDURE ALI/LWRH_SP ( IN list ALI/stringArray ) LANGUAGE SQL BEGIN -- 这里可以添加你的业务逻辑,比如遍历数组的示例: -- DECLARE i INT DEFAULT 1; -- WHILE i <= CARDINALITY(list) DO -- INSERT INTO your_target_table(target_col) VALUES(list[i]); -- SET i = i + 1; -- END WHILE; END;
3. 额外注意事项
- 确认你的IBM i版本是V7R1或更高,因为更早的版本不支持SQL数组类型;
- 如果使用DB2 for i的客户端工具(比如Data Studio),可以把语句分隔符设置为
@,这样就能把两个语句放在一起批量执行,示例:
CREATE TYPE ALI/stringArray AS ARRAY(100) OF VARCHAR(100); @ CREATE PROCEDURE ALI/LWRH_SP ( IN list ALI/stringArray ) LANGUAGE SQL BEGIN -- TO DO SOME WORK END; @
按照以上步骤修改后,就能解决SQL0104的错误了。
内容的提问来源于stack exchange,提问作者Mahmoud
相关产品推荐
相关产品推荐

