2015-02-16 23 views

Trả lời

6

Thứ nhất, bạn đang vi phạm các quy tắc của bình thường. Bạn phải suy nghĩ lại về thiết kế. Nếu bạn có các giá trị trong các cột trong bảng, thì để có được giá trị được tính, tất cả những gì bạn cần là một câu lệnh chọn để tìm nạp kết quả theo cách bạn muốn. Lưu trữ các giá trị tính toán thường là một ý tưởng tồi và được coi là một thiết kế tồi.

Dù sao,

Vì bạn đang sử 11g, Nếu bạn thực sự muốn có một cột tính toán, sau đó tôi sẽ đề nghị một VIRTUAL COLUMN hơn bằng tay cập nhật các cột. Có rất nhiều chi tiết trên không liên quan đến tuyên bố CẬP NHẬT. Sử dụng một cột ảo sẽ giảm rất nhiều chi phí. Ngoài ra, bạn sẽ hoàn toàn thoát khỏi nỗ lực thủ công và các dòng mã đó để thực hiện cập nhật. Oracle thực hiện công việc cho bạn.

Tất nhiên, bạn sẽ sử dụng cùng điều kiện kết nối trong mệnh đề cột ảo.

Cái gì đó như,

Column_c varchar2(50) GENERATED ALWAYS AS (column_a||'_'||column_b) VIRTUAL

Lưu ý: Có những hạn chế nhất định về việc sử dụng nó. Vì vậy, vui lòng tham khảo tài liệu trước khi triển khai. Tuy nhiên, đối với trường hợp sử dụng đơn giản do OP cung cấp, một cột ảo phù hợp với nhau.

Cập nhật Tôi đã làm một thử nghiệm nhỏ. Có vài quan sát. Vui lòng đọc số question này để hiểu rõ hơn về cách triển khai đề xuất của tôi.

12

Sử dụng các nhà điều hành concatentation ||:

update mytable set 
c = a || '_' || b 

Hoặc tốt hơn, để tránh phải chạy lại này bất cứ khi nào hàng được chèn hoặc cập nhật:

create view myview as 
select *, a || '_' || b as c 
from mytable 
Các vấn đề liên quan