oracle - 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_type
A 中,有两个日期的新现金流量,第一个是 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。我想获得类似的东西:
解决方案
你真的不需要程序。您可以使用以下查询生成额外的值:
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
如果您愿意或需要,您当然可以将其包装在一个过程中。
如果您将 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';
推荐阅读
- python - 如何对在python中存储为字符串的整数列表进行排序
- javascript - 我正确使用“这个”吗?jQuery
- gcc - 如何从 ioremap() 地址加载 avx-512 zmm 寄存器?
- javascript - React Native - 我们如何知道父元素包含哪些子元素?
- azure - Docker 映像无法推送到 Azure 注册表
- c# - 如何在 FlowLayoutPanel 中打印 PictureBoxes 的所有图像
- git - 配置时 Git-Jenkins 集成错误
- laravel - 访问被禁止读保护或不可读
- node.js - AWS Lambda javascript-sdk,实现 dynamodb putItem 方法接收超时
- sql - 联合 - 关键字“订单”附近的语法不正确