ROWID
एक छद्म स्तंभ है
, यह तालिका के डेटा डिक्शनरी दृश्य का हिस्सा नहीं है (उदा. यह dba_tab_columns
में प्रकट नहीं होता है ), इसलिए यह %rowtype
. में शामिल नहीं है . एक पीएल/एसक्यूएल रिकॉर्ड - जिसे आप पीएल/एसक्यूएल तालिका बना रहे हैं - का कोई भौतिक भंडारण नहीं है, इसलिए कोई वास्तविक या छद्म पंक्ति नहीं है।
यदि आप वास्तव में पंक्ति आईडी को रिकॉर्ड/टेबल में संग्रहीत करना चाहते हैं तो आपको स्पष्ट रूप से प्रकार घोषित करना होगा:
create or replace package dat_pkg is
type typ_dat_rec is record (
data_id data_test.data_id%type,
data_value data_test.data_value%type,
data_rowid rowid);
type typ_dat_tst is table of data_test%rowtype index by pls_integer;
procedure proc_test (p_dat typ_dat_tst);
end dat_pkg;
/
आप रिकॉर्ड फ़ील्ड को केवल rowid
नहीं कह सकते चूंकि यह एक डेटा प्रकार है, इसलिए मैंने इसे data_
. के साथ उपसर्ग किया है लेकिन आप कुछ और पसंद कर सकते हैं। और फिर आपको अपने पैकेज बॉडी में उस फ़ील्ड नाम का उपयोग करने की आवश्यकता है, जाहिर है:
create or replace package body dat_pkg is
procedure proc_test (p_dat typ_dat_tst)
is
begin
for i in 1..p_dat.count loop
update data_test
set data_value = p_dat(i).data_value
where data_id = p_dat(i).data_id
and rowid = p_dat(i).data_rowid;
end loop;
end proc_test;
end dat_pkg;
/
जैसा कि आपने सुझाव दिया था, आप संपूर्ण पंक्ति प्रकार और . को संग्रहीत कर सकते हैं रिकॉर्ड प्रकार में दो फ़ील्ड के रूप में पंक्ति आईडी:
create or replace package dat_pkg is
type typ_dat_rec is record (
data_rec data_test%rowtype,
data_rowid rowid);
type typ_dat_tst is table of typ_dat_rec index by pls_integer;
procedure proc_test (p_dat typ_dat_tst);
end dat_pkg;
/
लेकिन इससे खेतों का जिक्र थोड़ा और अजीब हो जाता है:
...
for i in 1..p_dat.count loop
update data_test
set data_value = p_dat(i).data_rec.data_value
where data_id = p_dat(i).data_rec.data_id
and rowid = p_dat(i).data_rowid;
end loop;
...
और यह शायद संग्रह को और भी अजीब बना देगा। जैसा कि आपको लूप में उन्हें संदर्भित करने में सक्षम होने के लिए सभी कॉलम/फ़ील्ड नामों को जानना है, मुझे यकीन नहीं है कि इसका बहुत फायदा है, लेकिन आप इसे अधिक साफ कर सकते हैं।
बेशक, ऐसा करने से यह मान लिया जाता है कि आपका संग्रह उसी डीबी और यहां तक कि सत्र में तालिका से डेटा के सबसेट से पॉप्युलेट किया जा रहा है, क्योंकि एक पंक्ति का rowid
समय के साथ बदल सकता है। आप forall
. में भी देखना चाहेंगे अपने for
. को बदलने के लिए सिंटैक्स लूप, आप वास्तव में क्या कर रहे हैं इसके आधार पर। (लेकिन आपको यह भी विचार करना चाहिए कि क्या आपको संग्रह की आवश्यकता है - यदि आप केवल संग्रह को पॉप्युलेट कर रहे हैं और फिर अपडेट के लिए इसका उपयोग कर रहे हैं तो एक एकल SQL अपडेट अभी भी तेज़ होगा ...)