DB2/400打开游标的替代方案



我正在运行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语句解析为true。

我尝试过遵循EXECUTE文档,显然INTO只能用于CALLVALUES 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时,你却在尝试使用静态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  ;

EXECUTE只能用于DML语句,而不能用于查询,因此除了声明动态游标之外,没有其他选择。话虽如此,与以任何其他方式执行查询相比,没有"打开光标的开销",因为对于任何查询,即使不是显式的,也仍然会隐式创建和打开光标。

光标的效率不如基于集合的操作,例如,当您在table2上打开光标并在循环中一行接一行地插入table1时,而不是执行类似INSERT INTO table1 SELECT something FROM table2 WHERE...的操作。在这种情况下,效率低下的原因是执行单行插入(或更新)与多行更新,而不是光标本身,这与"打开光标会带来大量开销"的说法完全不同。

由于在您的情况下,您无论如何只获取一条记录,因此这个循环与集合参数不适用。

相关内容

  • 没有找到相关文章

最新更新