【发布时间】:2021-04-13 07:50:15
【问题描述】:
通常,我的程序 (Oracle 12c) 如下所示:
PROCEDURE xxx AS
declare variables
BEGIN
save log
create table 1
save log
...
create table 2
save log
...
create table n
save log
END xxx
我创建表 1 到 n-1 作为辅助表(性能和模块化)以获得我想要的第 n 个表。当我应该使用全局临时表时,我使用的是普通表吗?
PD:我的第一个问题因基于意见而结束,我对其进行了修改以使其更加具体。
编辑:添加示例程序
create or replace PACKAGE BODY balance_mismatch_dca AS
idproceduregeneral VARCHAR2(50);
PROCEDURE aux_tables AS
balance_zufi_dca_exists INTEGER;
balance_dfkkop_dca_exists INTEGER;
BEGIN
idproceduregeneral := utl_call_stack.concatenate_subprogram(utl_call_stack.subprogram(1));
uxxxxxx_logs('Start Aux Tables', idproceduregeneral);
BEGIN
SELECT
COUNT(*)
INTO balance_zufi_dca_exists
FROM
sys.all_tables
WHERE
table_name = upper('balance_zufi_dca');
EXCEPTION
WHEN no_data_found THEN
balance_zufi_dca_exists := 0;
END;
IF ( balance_zufi_dca_exists ) = 1 THEN
EXECUTE IMMEDIATE q'[Drop Table balance_zufi_dca]';
END IF;
EXECUTE IMMEDIATE q'[
CREATE TABLE balance_zufi_dca
AS
WITH aux AS (
SELECT
vkont,
vtref,
MAX(zzmfvdat) AS lat
FROM
cdc.uap_zufi_t_dca_place@rbip
WHERE
zzextamount != 0
GROUP BY
vkont,
vtref
), aux2 AS (
SELECT
a.vkont,
a.vtref,
a.lat,
MAX(b.zzextamount) AS amount_zufi,
MAX(b.zzplacref) AS dca,
MAX(zzplace_typ) AS placement
FROM
aux a
JOIN cdc.uap_zufi_t_dca_place@rbip b ON ( b.vkont = a.vkont
AND b.vtref = a.vtref
AND b.zzmfvdat = a.lat )
GROUP BY
a.vkont,
a.vtref,
a.lat
)
SELECT
vkont,
SUM(amount_zufi) AS amount_zufi,
MAX(dca) AS dca,
MAX(placement) AS placement
FROM
aux2
GROUP BY
vkont
]'
;
uxxxxxx_logs('End Balance Zufi DCA', idproceduregeneral);
BEGIN
SELECT
COUNT(*)
INTO balance_dfkkop_dca_exists
FROM
sys.all_tables
WHERE
table_name = upper('balance_dfkkop_dca');
EXCEPTION
WHEN no_data_found THEN
balance_dfkkop_dca_exists := 0;
END;
IF ( balance_dfkkop_dca_exists ) = 1 THEN
EXECUTE IMMEDIATE q'[Drop Table balance_dfkkop_dca]';
END IF;
EXECUTE IMMEDIATE q'[
Create Table balance_dfkkop_dca AS
WITH aux AS (
SELECT /*+ FULL(a) */
vkont,
betrw as amount_dfkkop
FROM
cdc.uap_dfkkop@rbip a
WHERE
augrs IS NULL
AND augst IS NULL
AND stakz IS NULL
AND abwbl IS NULL
AND (studt <= to_char(sysdate, 'YYYYMMDD') or studt is null)
AND faedn <= to_char(sysdate, 'YYYYMMDD')
)
SELECT
*
FROM
aux
]'
;
uxxxxxx_logs('End Balance DFKKOP DCA', idproceduregeneral);
END aux_tables;
PROCEDURE gen_view AS
BEGIN
idproceduregeneral := utl_call_stack.concatenate_subprogram(utl_call_stack.subprogram(1));
EXECUTE IMMEDIATE q'[
CREATE OR REPLACE VIEW vw_bm_dca_volumes AS
WITH aux AS (
SELECT
a.vkont,
a.amount_zufi,
SUM(nvl(b.amount_dfkkop, 0)) AS amount_dfkkop
FROM
balance_zufi_dca a
LEFT JOIN balance_dfkkop_dca b ON ( b.vkont = a.vkont )
GROUP BY
a.vkont,
a.amount_zufi
)
SELECT
CASE
WHEN amount_zufi = amount_dfkkop THEN
'Chased for the Correct Balance'
WHEN amount_zufi > amount_dfkkop THEN
'Chased for Higher Balance'
WHEN amount_zufi < amount_dfkkop THEN
'Chased for Lower Balance'
ELSE
NULL
END AS status,
COUNT(1) AS ca_count,
round(RATIO_TO_REPORT(COUNT(1)) OVER() * 100, 2) perc
FROM
aux
GROUP BY
CASE
WHEN amount_zufi = amount_dfkkop THEN
'Chased for the Correct Balance'
WHEN amount_zufi > amount_dfkkop THEN
'Chased for Higher Balance'
WHEN amount_zufi < amount_dfkkop THEN
'Chased for Lower Balance'
ELSE
NULL
END
ORDER BY
COUNT(1) DESC
]'
;
EXECUTE IMMEDIATE q'[
CREATE OR REPLACE VIEW vw_bm_dca_data AS
WITH aux AS (
SELECT
a.vkont,
a.dca,
a.placement,
a.amount_zufi,
SUM(nvl(b.amount_dfkkop, 0)) AS amount_dfkkop
FROM
balance_zufi_dca a
LEFT JOIN balance_dfkkop_dca b ON ( b.vkont = a.vkont )
GROUP BY
a.vkont,
a.dca,
a.placement,
a.amount_zufi
)
SELECT
*
FROM
aux
WHERE
amount_zufi != amount_dfkkop
]'
;
uxxxxxx_logs('End Views', idproceduregeneral);
END gen_view;
END balance_mismatch_dca;
【问题讨论】: