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 = ?
我刚学会,我将无法在存储过程中使用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 = ?