【发布时间】:2021-09-30 08:43:38
【问题描述】:
我正在创建一个带有三个参数的 HANA 存储过程。这个存储过程正在从一个架构中提取数据,即FIRST_SCHEMA.. 但是我试图同时从两个架构FIRST_SCHEMA 和SECOND_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.AAA 和 SECOND_SCHEMA.AAA,但我只是复制了相同的代码并在两者之间添加了一个联合,但没有成功。
所以,我想要实现的是:
-
创建一个父存储过程调用两个子存储过程(
FirstSchemaSP和SecondSchemaSp) -
在父存储过程中有
-- 4. Join template with results,它将获取两个模式的结果。
虽然我有一个想法,但我不知道如何实现。我们将非常感谢您的帮助。
谢谢。
【问题讨论】:
-
实际错误是什么?或者解释一下“不跑步”是什么意思?这是整个过程还是剪裁出来的?
UNION ALL部分看起来很可疑。有DROP声明,然后是SELECT。您可以使用UNION组合两个SELECT语句。 -
@ReinisVerbelis 我已经用实际代码更新了我的帖子。请帮忙。