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

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

我刚学会,我不会用 INTO CLAUSE 在存储过程中,同时使用动态sql。
下面是我的动态sql。

  1. SET V_SELECT =
  2. 'SELECT ' || SELECT_FIELDS ||
  3. ' FROM ' || TABLE_NAME ||
  4. ' WHERE ' || WHERE_CLAUSE ||
  5. ' WITH UR';
  6. EXECUTE IMMEDIATE V_SELECT;

要求对多个查询使用该过程。
这就是我的查询在传递值之后的样子。

  1. SELECT B.PROD_TYP,
  2. A.PROD_LINE,
  3. B.PROD_TXT,
  4. B.PROD_TXT1
  5. FROM TABLE_A A
  6. INNER JOIN TABLE_B B
  7. ON A.ROW_ID = B.ROW_ID
  8. WHERE A.PROD_CD = HOST_VAR_PROD_CD;

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

egmofgnx

egmofgnx1#

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

  1. BEGIN
  2. DECLARE V_STMT VARCHAR(200);
  3. DECLARE V_CREATOR VARCHAR(128);
  4. DECLARE V_NAME VARCHAR(128);
  5. DECLARE V_COLCOUNT INT;
  6. DECLARE SQLSTATE CHAR(5);
  7. DECLARE C1 CURSOR FOR S1;
  8. SET V_CREATOR = 'SYSIBM';
  9. SET V_STMT = 'SELECT NAME, COLCOUNT FROM SYSIBM.SYSTABLES WHERE CREATOR = ?';
  10. PREPARE S1 FROM V_STMT;
  11. OPEN C1 USING V_CREATOR;
  12. L1: LOOP
  13. FETCH C1 INTO V_NAME, V_COLCOUNT;
  14. IF SQLSTATE = '02000' THEN LEAVE L1; END IF;
  15. --Some processing here
  16. END LOOP;
  17. CLOSE C1;
  18. END
  19. @
展开查看全部
5fjcxozz

5fjcxozz2#

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

  1. SET V_SELECT =
  2. 'values (SELECT ' || SELECT_FIELDS ||
  3. ' FROM ' || TABLE_NAME ||
  4. ' WHERE ' || WHERE_CLAUSE ||
  5. ' ) into ?,?,?' ||
  6. ' WITH UR';
  7. Prepare wSelect from :V_SELECT;
  8. //should be checking SQLSTATE/SQLCODE here for errors
  9. execute wSelect using :col1, :col2, col3;
  10. //should be checking SQLSTATE/SQLCODE here for errors

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

lxkprmvk

lxkprmvk3#

我用了下面的代码,它工作良好。我可以使用动态运行多个select。

  1. DECLARE DESC_CSR CURSOR WITH HOLD FOR V_SQL;
  2. SET V_SELECT =
  3. 'SELECT ' || SELECT_FIELDS ||
  4. ' FROM ' || TABLE_NAME ||
  5. ' WHERE ' || WHERE_CLAUSE ||
  6. ' WITH UR';
  7. PREPARE V_SQL FROM V_SELECT;
  8. OPEN DESC_CSR USING HOST_VAR_B;
  9. FETCH DESC_CSR INTO HOST_VAR_A;

我通过的参数如下。使用where子句host\u var\u b作为参数标记“?”,并在open处指定字段。

  1. SELECT_FIELDS = B.COLUMN_A INTO HOST_VAR_A
  2. TABLE_NAME = TABLE_A A INNER JOIN TABLE_B B
  3. ON A.ROW_ID = B.ROW_ID
  4. WHERE_CLAUSE = A.COLUMN_B = ?
展开查看全部

相关问题