Db2 声明游标中的锚行数据类型变量
如何使用db2中声明的游标中的锚点数据类型行声明变量Db2 声明游标中的锚行数据类型变量,db2,cursor,anchor,procedure,Db2,Cursor,Anchor,Procedure,如何使用db2中声明的游标中的锚点数据类型行声明变量 create or replace PROCEDURE "SP_ATUALIZA_ID_DISTRIBUIDOR_FT" BEGIN DECLARE C_ID_DIST_ERRADOS CURSOR FOR SELECT DISTINCT F.ID_MES, F.ID_DISTRIBUIDOR_S
create or replace PROCEDURE "SP_ATUALIZA_ID_DISTRIBUIDOR_FT"
BEGIN
DECLARE C_ID_DIST_ERRADOS CURSOR FOR
SELECT DISTINCT
F.ID_MES,
F.ID_DISTRIBUIDOR_SO,
D.CNPJ_DISTRIBUIDOR_SO,
F.ID_COMPANIA
FROM
DMTLDBR.TB_FATO_VENDAS_SELLOUT F,
DMTLDBR.TB_DIM_ECDISTRIBUIDOR_SO D
WHERE ID_MES <= 201309 AND
F.ID_DISTRIBUIDOR_SO = D.ID_DISTRIBUIDOR_SO AND
F.ID_COMPANIA <> D.ID_COMPANIA
ORDER BY ID_MES;
BEGIN
DECLARE REG_C_ID_DIST_ERRADOS ANCHOR ROW OF C_ID_DIST_ERRADOS;
OPEN C_ID_DIST_ERADOS
...
END;
END;
我有一个过程,它声明了一个内部游标,用于获取结果并插入变量'reg\u c\u id\u dist\u errados'。我尝试使用的锚行,但db2提醒了我。您可以使用表的锚行,以及其他内容。根据您的需求,有不同的方法来使用这些东西
您的查询有一个联接,因此您可以声明一个类型来匹配游标中的每一行,然后可以为您的行类型声明强类型游标类型。稍后,您可以将查询分配给该游标类型的变量
可以将游标作为参数传递给存储过程,也可以让过程返回游标类型,还可以声明所创建的每种类型的变量
您不显示是希望过程的结果集是游标类型,还是希望在类型化变量中的存储过程内部处理结果集
学习DB2LUW版本的Db2知识中心,了解强类型游标以及如何在SQLPL中使用它们
有一个在线示例显示为一个模块,但是您可以在文件modules.db2中的存储过程中使用相同的技术,如果您在安装时安装了SAMPLES组件,该文件也会显示在db2-LUW服务器的SAMPLES目录下
你可以在网上看到这个例子
对于与代码中的光标匹配的行类型,建议使用用户定义的类型:
--#SET TERMINATOR @
-- this type represents a row that might be returned in the cursor.
-- Choose your own name for the type.
-- Choose the correct data-types for your tables.
create or replace type DE_ROW_T as row
(
id_mes bigint,
ID_DISTRIBUIDOR_SO bigint,
CNPJ_DISTRIBUIDOR_SO bigint,
ID_COMPANIA bigint
)@
create or replace type C_ID_DIST_ERRADOS_CURSOR_T as DE_ROW_T CURSOR@
create or replace PROCEDURE "SP_ATUALIZA_ID_DISTRIBUIDOR_FT"
language sql
specific SP_ATUALIZA_ID_DISTRIBUIDOR_FT
BEGIN
DECLARE V_ROW DE_ROW_T;
DECLARE C_ID_DIST_ERRADOS C_ID_DIST_ERRADOS_CURSOR_T;
SET C_ID_DIST_ERRADOS = CURSOR FOR
SELECT DISTINCT
F.ID_MES,
F.ID_DISTRIBUIDOR_SO,
D.CNPJ_DISTRIBUIDOR_SO,
F.ID_COMPANIA
FROM
DMTLDBR.TB_FATO_VENDAS_SELLOUT F,
DMTLDBR.TB_DIM_ECDISTRIBUIDOR_SO D
WHERE ID_MES <= 201309 AND
F.ID_DISTRIBUIDOR_SO = D.ID_DISTRIBUIDOR_SO AND
F.ID_COMPANIA <> D.ID_COMPANIA
ORDER BY ID_MES;
OPEN C_ID_DIST_ERRADOS;
FETCH C_ID_DIST_ERRADOS INTO v_row;
END@