INTO CLAUSE in DYNAMIC SQL 的替代想法

Alternative ideas for INTO CLAUSE in DYNAMIC SQL

我刚学会,我将无法在存储过程中使用INTO CLAUSE,而使用动态sql。

下面是我的动态SQL。

SET V_SELECT =                   
  'SELECT ' || SELECT_FIELDS ||    
  ' FROM '  || TABLE_NAME    ||  
  ' WHERE ' || WHERE_CLAUSE  ||  
  ' WITH UR';    
EXECUTE IMMEDIATE V_SELECT;

要求使用该过程进行多个查询。

这是传递值后我的查询的样子。

  SELECT B.PROD_TYP,
          A.PROD_LINE,
          B.PROD_TXT,
          B.PROD_TXT1
   FROM TABLE_A   A
   INNER JOIN TABLE_B  B
   ON A.ROW_ID = B.ROW_ID
   WHERE A.PROD_CD = HOST_VAR_PROD_CD;

我必须 return SELECT fields.How 我 return 这些 fields.These 字段的值和 table 和查询将更改.

如何使用动态 sql 和游标的基本示例。

BEGIN
  DECLARE V_STMT VARCHAR(200);
  DECLARE V_CREATOR VARCHAR(128);
  DECLARE V_NAME VARCHAR(128);
  DECLARE V_COLCOUNT INT;
  DECLARE SQLSTATE CHAR(5);

  DECLARE C1 CURSOR FOR S1;

  SET V_CREATOR = 'SYSIBM';
  SET V_STMT = 'SELECT NAME, COLCOUNT FROM SYSIBM.SYSTABLES WHERE CREATOR = ?';
  PREPARE S1 FROM V_STMT;
  OPEN C1 USING V_CREATOR;
  L1: LOOP
    FETCH C1 INTO V_NAME, V_COLCOUNT;
    IF SQLSTATE = '02000' THEN LEAVE L1; END IF;
    --Some processing here
  END LOOP;
  CLOSE C1;
END
@

至少在 IBM i 的 Db2 上,

values into 可以动态准备,运行 可以用来代替 select into

您需要知道return编辑了多少列...

SET V_SELECT =                   
  'values (SELECT ' || SELECT_FIELDS ||    
  ' FROM '  || TABLE_NAME    ||  
  ' WHERE ' || WHERE_CLAUSE  ||  
  ' ) into ?,?,?' ||
  ' WITH UR';    

Prepare wSelect from :V_SELECT;
//should be checking SQLSTATE/SQLCODE here for errors

execute wSelect using :col1, :col2, col3;
//should be checking SQLSTATE/SQLCODE here for errors

如果 returned 的列数是动态的,您可以考虑使用 LISTAGG() 函数(如果可用的话) return 逗号分隔的字符串,所有值都在单个列中.

我使用了下面的代码并且工作正常。我能够使用 Dynamic 运行 多个 select。

DECLARE DESC_CSR CURSOR WITH HOLD FOR V_SQL;  

  SET V_SELECT =                              
  'SELECT ' || SELECT_FIELDS ||               
  ' FROM '  || TABLE_NAME    ||               
  ' WHERE ' || WHERE_CLAUSE  ||               
  ' WITH UR';                                 


  PREPARE V_SQL FROM V_SELECT;  

  OPEN DESC_CSR USING HOST_VAR_B;

  FETCH DESC_CSR INTO HOST_VAR_A;

我按如下方式传递参数。使用 where 子句 HOST_VAR_B 作为参数标记“?”并在 OPEN 分配字段。

SELECT_FIELDS = B.COLUMN_A  INTO HOST_VAR_A
TABLE_NAME =  TABLE_A A   INNER JOIN TABLE_B B      
              ON A.ROW_ID = B.ROW_ID
WHERE_CLAUSE = A.COLUMN_B = ?