在宏中引用存储过程输出参数?

时间:2015-05-26 17:28:39

标签: teradata

有没有办法在宏中引用存储过程的输出参数?

我的存储过程是:

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;
);

1 个答案:

答案 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

  );