Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Thay thế tên miền email

Mã bạn đã viết không có nhiều ý nghĩa; tìm nạp quá nhiều sẽ không hoạt động (hai cột thành một biến duy nhất?).

Đây là một ví dụ:một bảng thử nghiệm:

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.

Cách tách phần miền khỏi nó (cột thứ 2 của phần CHỌN sau) và cập nhật địa chỉ e-mail thành một miền mới (cột thứ 3):

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>

Hãy chỉ cập nhật các địa chỉ e-mail Gmail lên một miền mới:

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>

Nếu bạn muốn chuyển đổi nó thành một thủ tục, không có vấn đề gì:

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>

Nếu bạn thực sự muốn sử dụng con trỏ (tôi không biết tại sao bạn lại muốn làm điều đó; nó có lẽ sẽ là lựa chọn kém hiệu quả nhất), hãy truy cập vào đây:

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>

Vòng lặp FOR của con trỏ dễ duy trì hơn so với nỗ lực của bạn (tạo một con trỏ và một biến con trỏ, mở con trỏ, tìm nạp từ nó, quan tâm đến việc thoát khỏi vòng lặp, đóng con trỏ).

Nhưng, nếu bạn không thể sống mà không có nó, hãy truy cập vào đây:

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>

Đề xuất của tôi? Sử dụng SQL thuần túy, nếu có thể. Hoặc thủ tục PL / SQL đầu tiên. Không sử dụng con trỏ cho mục đích này.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. thêm tháng vào SQL ngày tháng

  2. Trình xử lý cài đặt Oracle Pro * C / OCI cho SIGSEGV / SIGABRT và bạn bè - tại sao và làm thế nào để tắt?

  3. GROUP BY không có chức năng tổng hợp

  4. Theo giai đoạn APPLIC_TOP trong Ứng dụng Oracle R12

  5. Làm thế nào để Nhận Định nghĩa Bảng trong Oracle?