有没有办法在宏中引用存储过程的输出参数?
我的存储过程是:
CREATE PROCEDURE db.ssis_load_nextID
(IN tbl VARCHAR(30), OUT nextID SMALLINT )
BEGIN
DECLARE maxID SMALLINT;
SELECT MAX(loadID) INTO maxID
FROM db.SSIS_Load
WHERE TABLENAME = tbl
GROUP BY TABLENAME;
IF maxID IS NULL THEN
SET nextID = 1;
ELSE
SET nextID = maxID + 1;
END if;
END;
我想在宏中引用这个结果,如:
CREATE MACRO db.tbSTG_m AS (
INSERT INTO db.tbProd (ID1, ID2, f1, f2, ..., fn, loadID)
SELECT ID1, ID2, f1, f2,..., fn,
CALL db.ssis_Load_nextID('tbProd',nextID)
FROM db.tbstg
; );
因为运行CALL db.ssis_Load_nextID('tbProd',nextID)
会在第一个(唯一)列的第一行(唯一)中返回我想要的结果。
我尝试将结果存储在宏中的变量中,但显然,这是不受支持的。
另外,我想从一个空的SSIS_load表开始,因此它会在加载第一个表时创建第一行,而不是在自动加载过程开始之前预先填充加载表。
所有帮助表示赞赏,
-Beth
fyi,我们通过删除'group by tablename
'子句并将sp嵌入宏中来实现它:
CREATE MACRO db.tbSTG_m AS (
INSERT INTO db.tbProd
SELECT ID1, ID2, f1, f2, ..., fn (
SELECT ZEROIFNULL(MAX(loadID))+1
FROM db.ssis_load
WHERE TABLENAME = 'tbStg') mx
FROM db.tbSTG;
);
答案 0 :(得分:1)
您不能使用存储过程(您必须使用UDF而不是过程)
然而,您可以在宏
中执行此操作语法可能不是100%正确..从内存工作,但应该让你关闭
我假设tbl是一个正确传递的参数?
基本上你加入id表并在你的插入中使用它......
然后用最大新插入的ID更新id表
CREATE MACRO db.tbSTG_m AS (
INSERT INTO db.tbProd (ID1, ID2, f1, f2, ..., fn, loadID)
SELECT ID1, ID2, f1, f2,..., fn, MAXloadID + SUM(1) OVER(ROWS UNBOUNDED PRECEDING)
FROM db.tbstg
cross join (SELECT MAX(loadID) as MAXloadID
FROM db.SSIS_Load
WHERE TABLENAME = tbl
GROUP BY TABLENAME) as IDGEN
;
update db.SSIS_Load from (select MAX(loadID) as MAXloadID from tbl) as upid
set loadID = upid.MAXloadID
where db.SSIS_Load.TABLENAME = tbl
);