【问题标题】:Draw data from Multi Schema using One Stored Procedure使用一个存储过程从多模式中提取数据
【发布时间】:2021-09-30 08:43:38
【问题描述】:

我正在创建一个带有三个参数的 HANA 存储过程。这个存储过程正在从一个架构中提取数据,即FIRST_SCHEMA.. 但是我试图同时从两个架构FIRST_SCHEMASECOND_SCHEMA 中提取信息。

两个架构具有相同的表名。

FIRST_SCHEMA 表(AAA、BBB、CCC、DDD、EEE)

SECOND_SCHEMA 表(AAA、BBB、CCC、DDD、EEE)

所以,下面的代码运行成功,它只从一个模式中提取数据。

set schema FIRST_SCHEMA;

CREATE procedure SP_TWO_COMPANIES(IN AsOfDate date, IN CompDate date, IN ReportLevel int)
as
begin
declare i int := 1;
declare m int;
select max("Levels") into m from DDD where "TemplateId"=1;

CurrentPeriod =
select      T3."AcctCode", T3."AcctName", T3."ActType", 
            sum((ifnull(T4."Debit",0)-ifnull(T4."Credit",0))) "AmountLC", 
            sum((ifnull(T4."SYSDeb",0)-ifnull(T4."SYSCred",0))) "AmountSC"
from        AAA T4
inner join  BBB T0 on T0."TransId"=T4."TransId"
left join   CCC T3 on T3."AcctCode"=T4."Account"
where       T3."GroupMask" in (1,2,3) and T0."RefDate" <= :AsOfDate
group by    T3."AcctCode", T3."AcctName", T3."ActType"
;

CurrentProfit =
select      '99999999' "AcctCode", 'Current Year Profit/ (Loss)' "AcctName", 
            sum((ifnull(T4."Debit",0)-ifnull(T4."Credit",0))) "AmountLC", 
            sum((ifnull(T4."SYSDeb",0)-ifnull(T4."SYSCred",0))) "AmountSC"
from        AAA T4
inner join  BBB T0 on T0."TransId"=T4."TransId"
left join   CCC T3 on T3."AcctCode"=T4."Account"
where       T3."GroupMask" not in (1,2,3) and T0."RefDate" <= :AsOfDate
;

CompPeriod =
select      T3."AcctCode", T3."AcctName", T3."ActType", 
            sum((ifnull(T4."Debit",0)-ifnull(T4."Credit",0))) "AmountLC", 
            sum((ifnull(T4."SYSDeb",0)-ifnull(T4."SYSCred",0))) "AmountSC"
from        AAA T4
inner join  BBB T0 on T0."TransId"=T4."TransId"
left join   CCC T3 on T3."AcctCode"=T4."Account"
where       T3."GroupMask" in (1,2,3) and T0."RefDate" <= :CompDate
group by    T3."AcctCode", T3."AcctName", T3."ActType"
;


CompProfit =
select      '99999999' "AcctCode", 'Current Year Profit/ (Loss)' "AcctName", 
            sum((ifnull(T4."Debit",0)-ifnull(T4."Credit",0))) "AmountLC", 
            sum((ifnull(T4."SYSDeb",0)-ifnull(T4."SYSCred",0))) "AmountSC"
from        AAA T4
inner join  BBB T0 on T0."TransId"=T4."TransId"
left join   CCC T3 on T3."AcctCode"=T4."Account"
where       T3."GroupMask" not in (1,2,3) and T0."RefDate" <= :CompDate
;

-- first level parent
create local temporary table #rpttemplate as(
select T1."Levels", T1."TemplateId", T1."CatId", T1."VisOrder", T1."Name", T1."VisOrder" as "TopParent", T1."CatId" as "TopParentCatId", 
T1."FatherNum", T1."Dummy", T1."Reversal", T1."SubSum"
from DDD T1
left join EEE T2 on T2."TemplateId"=T1."TemplateId" and T1."CatId"=T2."CatId"
where T1."TemplateId"=1 and T1."FatherNum"=0);


-- use while loop to replace CTE
while i <= m do

-- get child level
insert into #rpttemplate
select T1."Levels", T1."TemplateId", T1."CatId", T1."VisOrder", T1."Name", c."TopParent", c."TopParentCatId", T1."FatherNum", 
T1."Dummy", T1."Reversal", T1."SubSum"--T1.CatId as [TopParent]
from DDD T1
inner join #rpttemplate c on c."CatId"=T1."FatherNum"
where T1."TemplateId"=1 and T1."CatId"<>T1."FatherNum" and T1."Levels"= :i;

i := :i + 1;

end while;

-- 4. Join template with results
select      T0."TemplateId", T0."TopParent", upper(T4."Name") "TopParentName", T6."CatId" "Level2Id", upper(T6."Name") "Level2Name", 
            T0."Dummy", T0."Reversal", T0."VisOrder", T0."VisOrder" "Level3Id", upper(T0."Name") "Level3Name", 
            T1."VisOrder" as "Line_VisOrder", coalesce(T1."AcctCode", T7."AcctCode") "AcctCode",
            case when T7."AcctCode"='99999999' then 'CURRENT YEAR PROFIT/ (LOSS)' else upper(T3."AcctName") end "AcctName", 
            T3."ActType", 
            ifnull(coalesce(T2."AmountLC", T7."AmountLC"),0) "CurrentAmount", 
            ifnull(coalesce(T5."AmountLC", T8."AmountLC"),0) "CompAmount", 
            (select "CompnyName" from OADM) "CompnyName",
            (select "MainCurncy" from OADM) "MainCurncy",
            TO_VARCHAR(:AsOfDate, 'DD/MM/YYYY') "AsOfDate",
            TO_VARCHAR(:CompDate, 'DD/MM/YYYY')"CompDate"
from        #rpttemplate T0
left join   EEE T1 on T1."CatId"=T0."CatId" and T0."TemplateId"=T1."TemplateId"  -- to get gl acct code
left join   :CurrentPeriod T2 on T1."AcctCode"=T2."AcctCode"
left join   :CompPeriod T5 on T1."AcctCode"=T5."AcctCode"
left join   CCC T3 on T3."AcctCode"=T1."AcctCode"
left join   DDD T4 on T4."CatId"=T0."TopParentCatId" and T0."TemplateId"=T4."TemplateId"  -- to get level 1 ID
left join   DDD T6 on T6."CatId"=T0."FatherNum" and T0."TemplateId"=T6."TemplateId"
left join   :CurrentProfit T7 on T7."AcctName"=T0."Name"
left join   :CompProfit T8 on T8."AcctName"=T0."Name"
where       T0."Dummy"='N' and coalesce(T1."AcctCode", T7."AcctCode") is not null
order by    T0."VisOrder", T1."VisOrder"
;

drop table #rpttemplate;


end

我试图使用架构名称调用两个架构,即 FIRST_SCHEMA.AAASECOND_SCHEMA.AAA,但我只是复制了相同的代码并在两者之间添加了一个联合,但没有成功。

所以,我想要实现的是:

  1. 创建一个父存储过程调用两个子存储过程(FirstSchemaSPSecondSchemaSp

  2. 在父存储过程中有-- 4. Join template with results,它将获取两个模式的结果。

虽然我有一个想法,但我不知道如何实现。我们将非常感谢您的帮助。

谢谢。

【问题讨论】:

  • 实际错误是什么?或者解释一下“不跑步”是什么意思?这是整个过程还是剪裁出来的? UNION ALL 部分看起来很可疑。有DROP 声明,然后是SELECT。您可以使用UNION 组合两个SELECT 语句。
  • @ReinisVerbelis 我已经用实际代码更新了我的帖子。请帮忙。

标签: stored-procedures hana


【解决方案1】:

我猜你可以这样做:

CREATE OR REPLACE PROCEDURE FirstSchemaSP (
    IN AsOfDate DATE, 
    IN CompDate DATE, 
    IN ReportLevel INTEGER,
    OUT oResult TABLE (
        COL0 VARCHAR(10),
        COL1 DATE,
        COL2 DATE,
        COL3 INTEGER
    )
)
AS
BEGIN

    oResult = 
    SELECT 'First' AS COL0, :AsOfDate AS COL1, :CompDate AS COL2, :ReportLevel AS COL3 
    FROM DUMMY;

END;

CALL FirstSchemaSP(CURRENT_DATE, CURRENT_DATE, 1, ?);

CREATE OR REPLACE PROCEDURE SecondSchemaSP (
    IN AsOfDate DATE, 
    IN CompDate DATE, 
    IN ReportLevel INTEGER,
    OUT oResult TABLE (
        COL0 VARCHAR(10),
        COL1 DATE,
        COL2 DATE,
        COL3 INTEGER
    )
)
AS
BEGIN

    oResult = 
    SELECT 'Second' AS COL0, :AsOfDate AS COL1, :CompDate AS COL2, :ReportLevel AS COL3 
    FROM DUMMY;

END;

 CALL SecondSchemaSP(CURRENT_DATE, CURRENT_DATE, 1, ?);

CREATE OR REPLACE PROCEDURE SP_TWO_COMPANIES (
    IN AsOfDate DATE, 
    IN CompDate DATE, 
    IN ReportLevel INT
)
AS
BEGIN

    DECLARE FirstSchemaResult TABLE(
        COL0 VARCHAR(10),
        COL1 DATE,
        COL2 DATE,
        COL3 INTEGER
    );
    DECLARE SecondSchemaResult TABLE(
        COL0 VARCHAR(10),
        COL1 DATE,
        COL2 DATE,
        COL3 INTEGER
    ); 

    CALL FirstSchemaSP (:AsOfDate, :CompDate, :ReportLevel, :FirstSchemaResult); 
    CALL SecondSchemaSP (:AsOfDate, :CompDate, :ReportLevel, :SecondSchemaResult); 

    SELECT *
    FROM :FirstSchemaResult

    UNION ALL

    SELECT *
    FROM :SecondSchemaResult;

END;

CALL SP_TWO_COMPANIES(CURRENT_DATE, CURRENT_DATE, 1);

【讨论】:

  • 嗨 Reinis,您能否将我的代码包含在您的代码中,并在可能的情况下提供最终的存储过程。因为我是新手,所以我完全不知道该怎么做。
  • 一共有3个程序。你已经有一个了。向其中添加表输出参数,其中包含结束选择语句中的所有字段。在我的示例中,它是oResult。复制第二个模式的过程。然后创建调用这两个程序的包装程序。示例中的最后一个过程。
  • CALL FirstSchemaSP(CURRENT_DATE, CURRENT_DATE, 1, ?); 请问这个是干什么用的。
  • 这只是调用程序的测试。所以你可以看到它做了什么/返回了什么。
  • 非常感谢您的帮助。我现在能够从多个模式中检索数据。上帝保佑。
猜你喜欢
  • 2018-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-19
  • 2021-09-24
  • 1970-01-01
  • 1970-01-01
  • 2016-08-14
相关资源
最近更新 更多