Sử dụng động SQL để tạo ra hằng gói để theo dõi mà đối tượng tồn tại, và sau đó sử dụng những hằng số trong biên soạn có điều kiện.
--E.g., say there are two possible tables, but only one of them exists.
--create table table1(a number);
create table table2(a number);
--Create a package with boolean constants to track the objects.
--(Another way to do this is to use ALTER SESSION SET PLSQL_CCFLAGS)
declare
table1_exists_string varchar2(10) := 'true';
table2_exists_string varchar2(10) := 'true';
temp number;
begin
begin
execute immediate 'select max(1) from table1 where rownum <= 1' into temp;
exception when others then
table1_exists_string := 'false';
end;
begin
execute immediate 'select max(1) from table2 where rownum <= 1' into temp;
exception when others then
table2_exists_string := 'false';
end;
execute immediate '
create or replace package objects is
table1_exists constant boolean := '||table1_exists_string||';
table2_exists constant boolean := '||table2_exists_string||';
end;
';
end;
/
--Look at the results in the source:
select * from user_source where name = 'OBJECTS';
--Create the object that refers to the tables.
create or replace function compile_test return varchar2 is
v_test number;
begin
$if objects.table1_exists $then
select max(1) into v_test from table1;
return 'table1 exists';
$elsif objects.table2_exists $then
select max(1) into v_test from table2;
return 'table 2 exists';
$else
return 'neither table exists';
$end
end;
/
--Check the dependencies - only TABLE2 is dependent.
select * from user_dependencies where name = 'COMPILE_TEST';
--Returns 'table 2 exists'.
select compile_test from dual;
Trộn SQL động, PL/SQL động và biên dịch có điều kiện thường là một ý tưởng rất độc. Nhưng nó sẽ cho phép bạn đặt tất cả các SQL động xấu xí của bạn trong một gói cài đặt, và duy trì theo dõi phụ thuộc thực sự.
Điều này có thể hoạt động tốt trong môi trường bán động; ví dụ một chương trình được cài đặt với các bộ đối tượng khác nhau nhưng không thường xuyên thay đổi giữa chúng.
(Ngoài ra, nếu toàn bộ vấn đề này chỉ là để thay thế các thông báo lỗi đáng sợ với cảnh báo thân thiện, theo ý kiến của tôi đó là một ý tưởng rất tồi. Nếu hệ thống của bạn thất bại, sự thất bại phải rõ ràng để nó có thể được cố định ngay lập tức Hầu hết mọi người bỏ qua bất cứ điều gì mà bắt đầu với "nhắc nhở ...")
Nguồn
2011-10-13 08:34:32
Tôi không nghĩ rằng đây là một ý tưởng tốt cả, ngay cả khi nó đã có thể được. Bây giờ mã của bạn sẽ vượt qua biên dịch nhưng sẽ thất bại (được thiết kế để thất bại) khi chạy. Đó là một sự cân bằng tôi sẽ không mất nhẹ (nhưng tự nhiên YMMV). – user272735
@ user272735: Nó không nhất thiết phải thất bại, nếu tôi có mã work-around khác, tôi đã sử dụng nó thay vì thông điệp đầu ra. Tôi có mã workaround, nhưng nó chạy từ một kịch bản SQL * Plus và là một người dùng khác. Tôi đồng ý rằng điều đó rất nguy hiểm, ý tưởng của tôi là sử dụng nó như một biện pháp tạm thời để tôi có thể tiếp tục thử nghiệm, thay vì chờ ... và chờ ... để được hỗ trợ DBA. Tôi nghĩ rằng tôi đã nhìn thấy thủ đoạn tương tự một lần trong C, không chắc chắn nếu tôi có thể làm một cái gì đó tương tự như trong PL/SQL. – FrustratedWithFormsDesigner
Bạn có tất cả sự thông cảm của tôi bạn có thể thưởng thức khi bạn đang chờ đợi ... và chờ đợi ... DBA hỗ trợ (Tôi đã có bản thân mình quá - bực bội). Bất cứ điều gì giúp bạn tiến lên phía trước là tốt nếu _waste_ bị giảm trong dài hạn. Tôi chắc chắn rằng bạn biết cách dễ dàng những hacks tạm thời biến thành những cái vĩnh viễn. – user272735