首页 > 解决方案 > oracle,过程,带参数的表

问题描述

我想在 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);

表格cfl_param包含每种合同类型的参数,例如新现金流日期和新现金流百分比。在我的示例contract_typeA 中,有两个日期的新现金流量,第一个是 6 个月(40% cfl_value),第二个是 9 个月(30% cfl_value)。

表 'cfl_table' 有关于现金流的数据,最初每个 contract_id 在 column 中都有值'N' cfl_analyze

对于值为“A”的contract_type,该过程必须插入​​3 个新行:2 个具有新日期和cfl_value 的30% 和40%,另一个具有30% 的值但最初具有cfl_date。我想获得类似的东西:

程序结果表

标签: oracleplsqlprocedure

解决方案


你真的不需要程序。您可以使用以下查询生成额外的值:

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

union 的第一个分支获取原始日期,固定 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

db<>小提琴

如果您愿意或需要,您当然可以将其包装在一个过程中。

如果您将 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';

db<>小提琴


推荐阅读