Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

नेस्टेड तालिका में RowId मान शामिल करें

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 अपडेट अभी भी तेज़ होगा ...)




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. पिछला दशमलव शून्य हटाएं

  2. यह त्रुटि है ORA-12154:TNS:निर्दिष्ट कनेक्ट पहचानकर्ता को हल नहीं कर सका?

  3. Oracle में ABS () फ़ंक्शन

  4. Oracle में नियंत्रण फिर से शुरू करने के लिए लूप्स में CONTINUE का उपयोग करना

  5. ऑरैकल में संयोजन करते समय स्ट्रिंग्स को ऑर्डर करना