动态sql中into子句的替代思想

olqngx59  于 2021-07-29  发布在  Java
关注(0)|答案(3)|浏览(321)

我刚学会,我不会用 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;

我得把钱还回去 SELECT 字段。如何返回这些字段的值。这些字段、表和查询将更改。

egmofgnx

egmofgnx1#

如何使用动态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
@
5fjcxozz

5fjcxozz2#

至少在db2 for ibm i上, values into 可以动态地准备和运行,从而代替 select into 您需要知道返回了多少列。。。

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

如果返回的列数是动态的,则可以考虑使用 LISTAGG() 函数返回一个逗号分隔的字符串,其中所有值都在一列中。

lxkprmvk

lxkprmvk3#

我用了下面的代码,它工作良好。我可以使用动态运行多个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\u var\u 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 = ?

相关问题