मैं ओरेकल पीएल/एसक्यूएल में एक प्रक्रिया बनाना चाहता हूं जो पैरामीटर के आधार पर नकदी प्रवाह का विश्लेषण करने की अनुमति देता है।
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 महीने में (cfl_value
का 40%), 9 महीने में दूसरी (cfl_value
का 30%)।
तालिका 'cfl_table' में नकदी प्रवाह के बारे में डेटा है, मूल रूप से प्रत्येक अनुबंध_आईडी का मूल्य 'एन' कॉलम cfl_analyze
में है।
अनुबंध_प्रकार के लिए मूल्य 'ए' के साथ प्रक्रिया को 3 नई पंक्तियों को सम्मिलित करना होगा: 2 नई तिथियों के साथ और 30% और 40% cfl_value के साथ और दूसरा 30% मूल्य के साथ लेकिन orignally cfl_date के साथ। मैं ऐसा कुछ प्राप्त करना चाहता हूं:
प्रक्रिया के परिणामों के साथ तालिका
2 जवाब
आपको वास्तव में एक प्रक्रिया की आवश्यकता नहीं है। आप एक क्वेरी के साथ अतिरिक्त मान उत्पन्न कर सकते हैं जैसे:
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
संघ की पहली शाखा को निश्चित ३०% मूल्य के साथ मूल तिथि मिलती है; संघ की दूसरी शाखा मापदंडों के आधार पर अन्य तिथियों और मूल्यों की गणना करती है।
फिर आप इसे एक सम्मिलित कथन में उपयोग कर सकते हैं:
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
ओरेकल डेटाबेस ओरेकल कॉर्पोरेशन द्वारा बनाया गया एक मल्टी-मॉडल डेटाबेस मैनेजमेंट सिस्टम है। Oracle, जैसे जावा और MySQL के स्वामित्व वाले अन्य उत्पादों के लिए इस टैग का उपयोग न करें।