我正在运行DB2 for i,V7R2 TR3.
我被告知打开游标会提供很多开销,应该尽可能避免.从我所读到的,使用EXECUTE INTO var1 USING var2
是另一种选择,但我不能让它工作.我收到SQL0104错误.
这是我的存储过程:
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
语句解析为真.
我已经尝试过遵循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是前缀的长度.
您收到错误,因为EXECUTE stmt INTO
它不像您认为的那样工作.
真正的问题是,当您不需要时,您正尝试使用动态SQL.请改用静态.
BEGIN SELECT SUBSTR (TRIM(ITEM), ( LENGTH ( TRIM ( PREFIX ) ) + 1 ) , ( 20 - LENGTH ( TRIM ( PREFIX ) ) ) ) INTO BASEITEM 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; IF(TRIM(BASEITEM) = '') THEN SET BASEITEM = ITEM; END IF; END ;