oracle, 过程, table with params
oracle, procedure, table with params
我想在 Oracle PL/SQL 中创建一个允许基于参数分析现金流量的过程。
create table cfl_param (
contract_type varchar2(20),
new_cfl_month number,
cfl_percentage number
);
create table cfl_table (
contract_id varchar2(20),
contract_type varchar2(20),
cfl_analyze varchar2(20),
cfl_date date,
cfl_value number
);
insert into cfl_param values
('A', 6, 0.4);
insert into cfl_param values
('A', 9, 0.3);
insert into cfl_table values
('A_1', 'A', 'N', date '2020-07-31', 1000);
Table cfl_param
具有适用于每种合同类型的参数,例如新现金流量日期和新现金流量百分比。在我的例子中 contract_type
A,有两个日期的新现金流,第一个在 6 个月内(cfl_value
的 40%),第二个在 9 个月内(cfl_value
的 30%)。
Table 'cfl_table' 有关于现金流量的数据,原来每个 contract_id 在 cfl_analyze
.
列中有值 'N'
对于值为 'A' 的 contract_type,该过程必须插入 3 个新行:2 个带有新日期以及 cfl_value 的 30% 和 40%,另一个带有 30%价值但最初 cfl_date。我想得到这样的东西:
Table with results of the procedure
你真的不需要手术。您可以使用如下查询生成额外值:
select ct.contract_id, ct.contract_type, 'Y' as cfl_analyze,
ct.cfl_date, 0.3 * ct.cfl_value as cfl_value
from cfl_table ct
where ct.contract_id = 'A_1'
union all
select ct.contract_id, ct.contract_type, 'Y' as cfl_analyze,
add_months(ct.cfl_date, cp.new_cfl_month) as cfl_date,
ct.cfl_value * cp.cfl_percentage as cfl_value
from cfl_table ct
join cfl_param cp on cp.contract_type = ct.contract_type
where ct.contract_id = 'A_1';
CONTRACT_ID CONTRACT_TYPE C CFL_DATE CFL_VALUE
-------------------- -------------------- - ---------- ----------
A_1 A Y 2020-07-31 300
A_1 A Y 2021-01-31 400
A_1 A Y 2021-04-30 300
工会第一个分支获得固定30%值的原始日期;联合的第二个分支根据参数计算其他日期和值。
然后你可以在插入语句中使用它:
insert into cfl_table (contract_id, contract_type, cfl_analyze, cfl_date, cfl_value)
select ct.contract_id, ct.contract_type, 'Y', ct.cfl_date, 0.3 * ct.cfl_value
from cfl_table ct
where ct.contract_id = 'A_1'
union all
select ct.contract_id, ct.contract_type, 'Y',
add_months(ct.cfl_date, cp.new_cfl_month),
ct.cfl_value * cp.cfl_percentage
from cfl_table ct
join cfl_param cp on cp.contract_type = ct.contract_type
where ct.contract_id = 'A_1';
3 rows inserted.
select * from cfl_table;
CONTRACT_ID CONTRACT_TYPE CFL_ANALYZE CFL_DATE CFL_VALUE
-------------------- -------------------- -------------------- ---------- ----------
A_1 A N 2020-07-31 1000
A_1 A Y 2020-07-31 300
A_1 A Y 2021-01-31 400
A_1 A Y 2021-04-30 300
如果您愿意或需要,您当然可以将其包装在一个过程中。
如果将 30% 添加为额外参数,会简单一些:
insert into cfl_param values
('A', 0, 0.3);
那么你就不需要联合了:
insert into cfl_table (contract_id, contract_type, cfl_analyze, cfl_date, cfl_value)
select ct.contract_id, ct.contract_type, 'Y',
add_months(ct.cfl_date, cp.new_cfl_month),
ct.cfl_value * cp.cfl_percentage
from cfl_table ct
join cfl_param cp on cp.contract_type = ct.contract_type
where ct.contract_id = 'A_1';
我认为您需要使用 UNION ALL
来生成额外的记录,如下所示:
INSERT INTO CFL_TABLE (CONTRACT_ID, CONTRACT_TYPE, CFL_ANALYZE, CFL_DATE, CFL_VALUE
)
SELECT CT.CONTRACT_ID,
CT.CONTRACT_TYPE,
'Y' AS CFL_ANALYZE,
ADD_MONTHS(CT.CFL_DATE, CP.NEW_CFL_MONTH) AS CFL_DATE,
CT.CFL_VALUE * CP.CFL_PERCENTAGE AS CFL_VALUE
FROM CFL_TABLE CT
JOIN CFL_PARAM CP ON CP.CONTRACT_TYPE = CT.CONTRACT_TYPE
WHERE CT.CONTRACT_ID = 'A_1'
UNION ALL
SELECT CT.CONTRACT_ID,
CT.CONTRACT_TYPE,
'Y' AS CFL_ANALYZE,
CT.CFL_DATE,
CT.CFL_VALUE * CP.CFL_PERCENTAGE AS CFL_VALUE
FROM CFL_TABLE CT
JOIN (
SELECT CONTRACT_TYPE,
1 - SUM(CFL_PERCENTAGE) AS CFL_PERCENTAGE
FROM CFL_PARAM
GROUP BY CONTRACT_TYPE
) CP
ON CP.CONTRACT_TYPE = CT.CONTRACT_TYPE
WHERE CT.CONTRACT_ID = 'A_1'
我想在 Oracle PL/SQL 中创建一个允许基于参数分析现金流量的过程。
create table cfl_param (
contract_type varchar2(20),
new_cfl_month number,
cfl_percentage number
);
create table cfl_table (
contract_id varchar2(20),
contract_type varchar2(20),
cfl_analyze varchar2(20),
cfl_date date,
cfl_value number
);
insert into cfl_param values
('A', 6, 0.4);
insert into cfl_param values
('A', 9, 0.3);
insert into cfl_table values
('A_1', 'A', 'N', date '2020-07-31', 1000);
Table cfl_param
具有适用于每种合同类型的参数,例如新现金流量日期和新现金流量百分比。在我的例子中 contract_type
A,有两个日期的新现金流,第一个在 6 个月内(cfl_value
的 40%),第二个在 9 个月内(cfl_value
的 30%)。
Table 'cfl_table' 有关于现金流量的数据,原来每个 contract_id 在 cfl_analyze
.
对于值为 'A' 的 contract_type,该过程必须插入 3 个新行:2 个带有新日期以及 cfl_value 的 30% 和 40%,另一个带有 30%价值但最初 cfl_date。我想得到这样的东西:
Table with results of the procedure
你真的不需要手术。您可以使用如下查询生成额外值:
select ct.contract_id, ct.contract_type, 'Y' as cfl_analyze,
ct.cfl_date, 0.3 * ct.cfl_value as cfl_value
from cfl_table ct
where ct.contract_id = 'A_1'
union all
select ct.contract_id, ct.contract_type, 'Y' as cfl_analyze,
add_months(ct.cfl_date, cp.new_cfl_month) as cfl_date,
ct.cfl_value * cp.cfl_percentage as cfl_value
from cfl_table ct
join cfl_param cp on cp.contract_type = ct.contract_type
where ct.contract_id = 'A_1';
CONTRACT_ID CONTRACT_TYPE C CFL_DATE CFL_VALUE
-------------------- -------------------- - ---------- ----------
A_1 A Y 2020-07-31 300
A_1 A Y 2021-01-31 400
A_1 A Y 2021-04-30 300
工会第一个分支获得固定30%值的原始日期;联合的第二个分支根据参数计算其他日期和值。
然后你可以在插入语句中使用它:
insert into cfl_table (contract_id, contract_type, cfl_analyze, cfl_date, cfl_value)
select ct.contract_id, ct.contract_type, 'Y', ct.cfl_date, 0.3 * ct.cfl_value
from cfl_table ct
where ct.contract_id = 'A_1'
union all
select ct.contract_id, ct.contract_type, 'Y',
add_months(ct.cfl_date, cp.new_cfl_month),
ct.cfl_value * cp.cfl_percentage
from cfl_table ct
join cfl_param cp on cp.contract_type = ct.contract_type
where ct.contract_id = 'A_1';
3 rows inserted.
select * from cfl_table;
CONTRACT_ID CONTRACT_TYPE CFL_ANALYZE CFL_DATE CFL_VALUE
-------------------- -------------------- -------------------- ---------- ----------
A_1 A N 2020-07-31 1000
A_1 A Y 2020-07-31 300
A_1 A Y 2021-01-31 400
A_1 A Y 2021-04-30 300
如果您愿意或需要,您当然可以将其包装在一个过程中。
如果将 30% 添加为额外参数,会简单一些:
insert into cfl_param values
('A', 0, 0.3);
那么你就不需要联合了:
insert into cfl_table (contract_id, contract_type, cfl_analyze, cfl_date, cfl_value)
select ct.contract_id, ct.contract_type, 'Y',
add_months(ct.cfl_date, cp.new_cfl_month),
ct.cfl_value * cp.cfl_percentage
from cfl_table ct
join cfl_param cp on cp.contract_type = ct.contract_type
where ct.contract_id = 'A_1';
我认为您需要使用 UNION ALL
来生成额外的记录,如下所示:
INSERT INTO CFL_TABLE (CONTRACT_ID, CONTRACT_TYPE, CFL_ANALYZE, CFL_DATE, CFL_VALUE
)
SELECT CT.CONTRACT_ID,
CT.CONTRACT_TYPE,
'Y' AS CFL_ANALYZE,
ADD_MONTHS(CT.CFL_DATE, CP.NEW_CFL_MONTH) AS CFL_DATE,
CT.CFL_VALUE * CP.CFL_PERCENTAGE AS CFL_VALUE
FROM CFL_TABLE CT
JOIN CFL_PARAM CP ON CP.CONTRACT_TYPE = CT.CONTRACT_TYPE
WHERE CT.CONTRACT_ID = 'A_1'
UNION ALL
SELECT CT.CONTRACT_ID,
CT.CONTRACT_TYPE,
'Y' AS CFL_ANALYZE,
CT.CFL_DATE,
CT.CFL_VALUE * CP.CFL_PERCENTAGE AS CFL_VALUE
FROM CFL_TABLE CT
JOIN (
SELECT CONTRACT_TYPE,
1 - SUM(CFL_PERCENTAGE) AS CFL_PERCENTAGE
FROM CFL_PARAM
GROUP BY CONTRACT_TYPE
) CP
ON CP.CONTRACT_TYPE = CT.CONTRACT_TYPE
WHERE CT.CONTRACT_ID = 'A_1'