आपके द्वारा लिखा गया कोड ज्यादा समझ में नहीं आता है; बहुत अधिक फ़ेचिंग जो काम नहीं करेगा (एक चर में दो कॉलम?)।
यहां एक उदाहरण दिया गया है:एक परीक्षण तालिका:
SQL> create table test (email varchar2(30));
Table created.
SQL> insert into test
2 select '[email protected]' from dual union all
3 select '[email protected]' from dual union all
4 select '[email protected]' from dual union all
5 select '[email protected]' from dual;
4 rows created.
इससे डोमेन भाग को कैसे विभाजित करें (निम्नलिखित चयन का दूसरा कॉलम) और ई-मेल पते को एक नए डोमेन (तीसरा कॉलम) में अपडेट करें:
SQL> select email,
2 substr(email, instr(email, '@') + 1) domain,
3 replace(email,
4 substr(email, instr(email, '@') + 1),
5 'new_domain.com'
6 ) result
7 from test;
EMAIL DOMAIN RESULT
------------------------- --------------- -------------------------
[email protected] hotmail.com [email protected]_domain.com
[email protected] net.hr [email protected]_domain.com
[email protected] gmail.com [email protected]_domain.com
[email protected] gmail.com [email protected]_domain.com
SQL>
आइए केवल Gmail ई-मेल पतों को नए डोमेन में अपडेट करें:
SQL> update test set
2 email = replace(email,
3 substr(email, instr(email, '@') + 1),
4 'new_domain.com'
5 )
6 where substr(email, instr(email, '@') + 1) = 'gmail.com';
2 rows updated.
SQL> select * From test;
EMAIL
-------------------------
[email protected]
[email protected]
[email protected]_domain.com
[email protected]_domain.com
SQL>
यदि आप इसे एक प्रक्रिया में बदलना चाहते हैं, तो कोई बात नहीं:
SQL> rollback;
Rollback complete.
SQL> create or replace procedure p_change_domain
2 (par_old_domain in varchar2,
3 par_new_domain in varchar2)
4 is
5 begin
6 update test set
7 email = replace(email,
8 substr(email, instr(email, '@') + 1),
9 par_new_domain
10 )
11 where substr(email, instr(email, '@') + 1) = par_old_domain;
12 end;
13 /
Procedure created.
SQL> exec p_change_domain('gmail.com', 'new_domain_2.com');
PL/SQL procedure successfully completed.
SQL> select * From test;
EMAIL
-------------------------
[email protected]
[email protected]
[email protected]_domain_2.com
[email protected]_domain_2.com
SQL>
यदि आप सख्त रूप से कर्सर का उपयोग करना चाहते हैं (मुझे नहीं पता कि आप ऐसा क्यों करना चाहेंगे; यह शायद सबसे अक्षम विकल्प होगा), तो आप यहां जाएं:
SQL> rollback;
Rollback complete.
SQL> create or replace procedure p_change_domain
2 (par_old_domain in varchar2,
3 par_new_domain in varchar2)
4 is
5 begin
6 for cur_r in (select email from test
7 where substr(email, instr(email, '@') + 1) = par_old_domain
8 )
9 loop
10 update test set
11 email = replace(email,
12 substr(email, instr(email, '@') + 1),
13 par_new_domain
14 )
15 where email = cur_r.email;
16 end loop;
17 end;
18 /
Procedure created.
SQL> exec p_change_domain('gmail.com', 'new_domain_3.com');
PL/SQL procedure successfully completed.
SQL> select * From test;
EMAIL
-------------------------
[email protected]
[email protected]
[email protected]_domain_3.com
[email protected]_domain_3.com
SQL>
लूप के लिए कर्सर आपके प्रयास की तुलना में बनाए रखना आसान है (कर्सर और कर्सर वैरिएबल बनाना, कर्सर खोलना, उससे लाना, लूप से बाहर निकलने का ध्यान रखना, कर्सर को बंद करना)।
लेकिन, अगर आप इसके बिना नहीं रह सकते हैं, तो यहां जाएं:
SQL> rollback;
Rollback complete.
SQL> create or replace procedure p_change_domain
2 (par_old_domain in varchar2,
3 par_new_domain in varchar2)
4 is
5 cursor c1 is
6 select email from test
7 where substr(email, instr(email, '@') + 1) = par_old_domain;
8 c1r c1%rowtype;
9 begin
10 open c1;
11 loop
12 fetch c1 into c1r;
13 exit when c1%notfound;
14
15 update test set
16 email = replace(email,
17 substr(email, instr(email, '@') + 1),
18 par_new_domain
19 )
20 where email = c1r.email;
21 end loop;
22 close c1;
23 end;
24 /
Procedure created.
SQL> exec p_change_domain('gmail.com', 'new_domain_4.com');
PL/SQL procedure successfully completed.
SQL> select * From test;
EMAIL
-------------------------
[email protected]
[email protected]
[email protected]_domain_4.com
[email protected]_domain_4.com
SQL>
मेरा सुझाव? यदि संभव हो तो शुद्ध एसक्यूएल का प्रयोग करें। या पहली पीएल/एसक्यूएल प्रक्रिया। इस उद्देश्य के लिए कर्सर का प्रयोग न करें।