【发布时间】:2016-01-07 17:50:17
【问题描述】:
我正在运行 DB2 for i,V7R2 TR3。
有人告诉我打开游标会带来很多开销,应尽可能避免。根据我的阅读,使用 EXECUTE INTO var1 USING var2 是一种替代方法,但我无法让它工作。我收到了SQL0104 error。
这是我的存储过程:
BEGIN
DECLARE STMT1 VARCHAR ( 500 ) ;
SET STMT1 = 'SELECT SUBSTR (''' || TRIM(ITEM) || ''' , ( LENGTH ( TRIM ( PREFIX ) ) + 1 ) , ( 20 - LENGTH ( TRIM ( PREFIX ) ) ) ) ' ||
'FROM MYLIB.MYTABLE ' ||
'WHERE PREFIX = SUBSTR(''' || TRIM(ITEM) || ''', 0,LENGTH ( TRIM ( PREFIX ) ) + 1 ) ' ||
'AND SEQ1 = ' || TYPE || ' ' ||
'ORDER BY LENGTH ( TRIM ( PREFIX) ) DESC , TRIM (PREFIX) DESC ' ||
'FETCH FIRST 1 ROWS ONLY ';
PREPARE S1 FROM STMT1;
EXECUTE S1 INTO BASEITEM;
--OPEN C1 ;
-- FETCH C1 INTO BASEITEM ;
--CLOSE C1 ;
IF(TRIM(BASEITEM) = '') THEN
SET BASEITEM = ITEM;
END IF;
END ;
它定义了三个变量:
IN ITEM CHAR(20) CCSID 37 DEFAULT '' ,
IN TYPE INT DEFAULT 1 ,
INOUT BASEITEM CHAR(20) DEFAULT ''
当我有 EXECUTE INTO... 时,它不会编译,如果我使用 EXECUTE USING... 它会编译,但 BASEITEM 最终为空白,IF 语句解析为 true。
我已尝试遵循EXECUTE 文档,显然INTO 只能用于CALL 或VALUES INTO 语句。所以我随后尝试关注VALUES INTO 文档,但无法弄清楚如何使用它进行查询。
注意*:我想最终将连接变量更改为使用参数标记,但接下来我会担心这个。
我想我应该发布正在使用的表格: MYLIB.MYTABLE
Column |Prefix|SEQ1|SEQ2|
Row 1 |aaa | 1| 3|
Row 2 |aab | 1| 3|
Row 3 |aabd | 2| 4|
我实际上是在传递一个字符串,然后从字符串中删除最长的前缀。然后我返回了新字符串。 SEQ1 只是前缀的类型(1 或 2),SEQ2 是前缀的长度。
【问题讨论】:
标签: db2 ibm-midrange db2-400