2010-02-17 26 views
13

Bạn thường lưu trữ các hằng số PL/SQL ở đâu? Ở cấp độ thân gói? Trong đặc điểm kỹ thuật? Tôi cũng đã thấy một số người giữ các hằng số trong một gói chuyên biệt chỉ cho các hằng số. Các phương pháp hay nhất trong lĩnh vực này là gì?Nơi giữ các hằng số PL/SQL?

Cảm ơn.

Trả lời

6

Một nhược điểm là có hằng số trong gói hoặc thông số là khi bạn biên dịch lại gói, bất kỳ phiên người dùng nào có trạng thái gói trong PGA sẽ nhận được ORA-04068. Vì lý do này, trong một môi trường phát triển lớn, chúng tôi đã thông qua quy ước có một gói chỉ riêng biệt để giữ các hằng số (và các gói phần tử nếu có) cho mỗi gói. Sau đó chúng tôi áp đặt một quy tắc nói rằng các gói chỉ dành riêng cho chỉ được phép tham chiếu bởi gói "sở hữu" của chúng - chúng tôi đã thực thi tại quá trình xem xét mã. Không phải là một giải pháp hoàn hảo, nhưng nó đã làm việc cho chúng tôi vào thời điểm đó. Vì lý do tương tự, tôi không bao giờ đề nghị một-hằng-gói-to-rule-tất-cả-bởi vì mỗi khi ai đó cần phải giới thiệu một hằng số mới, hoặc sửa đổi một hiện có, tất cả các phiên người dùng có được ORA- 04068.

+3

Lời kết để hoàn thành: thực hành tốt nhất là xác định mọi thứ càng gần với việc sử dụng càng tốt: nếu hằng số chỉ được sử dụng bởi một quy trình, hãy xác định nó trong quy trình đó; nếu hằng số chỉ được sử dụng trong thân gói, hãy xác định nó trong thân gói (ngoại trừ bài toán ORA-04068 được chú ý ở trên - điều này trở nên ít hơn trong một vấn đề trong 11gR2, nó sẽ được đề cập, nếu các phiên bản được sử dụng). –

4

Trong nhiều trường hợp, bạn muốn giữ chúng trong đặc tả để các gói khác có thể sử dụng chúng, đặc biệt là tham số khi gọi các hàm và thủ tục từ gói của bạn.

Chỉ khi bạn muốn giữ riêng tư cho gói, bạn nên đặt chúng vào phần thân.

Có gói chỉ dành cho các hằng số có thể là một ý tưởng tốt cho các hằng số không liên quan đến bất kỳ đoạn mã nào nói riêng, nhưng có liên quan cho toàn bộ lược đồ.

1

Tôi muốn các hằng số được, theo mặc định, trong thân gói trừ khi bạn sử dụng hằng số làm giá trị tham số cho một trong các thủ tục/hàm gói công khai của bạn hoặc dưới dạng giá trị trả về cho các hàm của bạn.

Vấn đề với việc đặt hằng số của bạn trong đặc tả gói là nếu bạn cần thay đổi kiểu của hằng số, các gói khác có thể không sử dụng hằng số vì nó chỉ ở đó. Nếu hằng số là riêng tư ở nơi đầu tiên, thì bạn không cần thực hiện phân tích tác động cho mỗi thay đổi.

Nếu bạn cần lưu trữ các đối tượng như ngôn ngữ mặc định hoặc các nội dung tương tự, thì tôi sẽ đóng gói các đối tượng đó theo các chức năng như get_default_language v.v ... và giữ các hằng số riêng tư.

1

Tôi muốn lo ngại về việc "một gói để quy tắc hằng số" vì trạng thái gói - hằng số, biến và mã - được lưu trong PGA của người dùng khi lần đầu tiên gọi bất kỳ biến hoặc gói công khai nào. Một gói hằng số, nếu công cộng, nên được scoped vào gói, và được sử dụng bởi chỉ bởi các phương pháp của gói.

Hằng số có phạm vi kéo dài các gói phải nằm trong bảng mã có mô tả, được tham gia theo yêu cầu. Hằng số không phải là và các biến không, sau khi tất cả. Việc có một bảng khóa-giá trị-cặp của "hằng số" làm cho chúng trở nên công khai và làm cho chúng thay đổi một cách năng động.

3

Đối với ứng dụng của chúng tôi, tất cả các hằng số đều nằm trong một bảng. Một hàm đơn giản được sử dụng để trích xuất chúng. Không có vấn đề gì với việc biên dịch lại, ORA-04068, ...

+3

Vậy thì chúng không thực sự là "hằng số", đúng không? :-) – ObiWanKenobi

+1

_ "Hằng số của một người là biến số của một người khác." _ - Alan Perlis – user272735

2

Tùy chọn tốt nhất theo ý kiến ​​của tôi. Lưu trữ "hằng số" trong một bảng và tạo một hàm chung để nhận các giá trị.Không 04068