是的。這裏是第一個存儲過程希望從XALL_TABLES中選擇的示例,但如果該表不存在,則從雙重選擇。最後,因爲我沒有XALL_TABLES對象,所以第一個存儲過程從雙重選擇。第二個,在ALL_TABLES對象上做同樣的事情。因爲ALL_TABLES存在,所以第二個存儲過程從all_tables中選擇,而不是從DUAL中選擇。
這樣的結構,其中包必須被部署在未部署無處不在的所有數據庫和使用表...(好吧,也許有一個概念性的問題,但它發生)是有用的。
--conditionals compilation instructions accept only static condition (just with constants)
--passing sql bind variable doesn't work
--To pass a value to a conditional compilation instruction, I bypasses the use of input parameters of the script
--these 4 next lines affect a value to the first and the second input parameter of the script
--If your originally script use input script parameter, use the next free parameter ...
column param_1 new_value 1 noprint
select nvl(max(1), 0) param_1 from all_views where owner = 'SYS' and view_name = 'XALL_TABLES';
column param_2 new_value 2 noprint
select nvl(max(1), 0) param_2 from all_views where owner = 'SYS' and view_name = 'ALL_TABLES';
CREATE or replace PACKAGE my_pkg AS
function test_xall_tables return varchar2;
function test_all_tables return varchar2;
END my_pkg;
/
CREATE or replace PACKAGE BODY my_pkg AS
function test_xall_tables return varchar2 is
vch varchar2(50);
begin
$IF (&1 = 0) $THEN
select 'VIEW XALL_TABLES D''ONT EXISTS' into vch from dual;
$ELSE
select max('VIEW XALL_TABLES EXISTS') into vch from XALL_TABLES;
$END
return vch;
end test_xall_tables;
function test_all_tables return varchar2 is
vch varchar2(50);
begin
$IF (&2 = 0) $THEN
select 'VIEW ALL_TABLES D''ONT EXISTS' into vch from dual;
$ELSE
select max('VIEW ALL_TABLES EXISTS') into vch from ALL_TABLES;
$END
return vch;
end test_all_tables;
END my_pkg;
/
測試:
select my_pkg.test_xall_tables from dual;
給
VIEW XALL_TABLES D'ONT EXISTS
select my_pkg.test_all_tables from dual;
給
VIEW ALL_TABLES EXISTS
我不認爲這是一個好主意,即使這是可能的。現在,您的代碼將通過編譯,但會在運行時失敗(設計失敗)。這是一個折衷,我不會輕視(但自然是YMMV)。 – user272735
@ user272735:如果我有其他解決方法的代碼,我不會使用它,而不是輸出消息。我有解決方法的代碼,但它從SQL * Plus腳本運行並作爲不同的用戶運行。我同意這是有風險的,我的想法是將其作爲一種臨時措施,以便我可以繼續測試,而不是等待......並等待......爲DBA提供幫助。我以爲我曾經在C中看過類似的技巧,不確定我是否可以在PL/SQL中做類似的事情。 – FrustratedWithFormsDesigner
當你等待時,你可以享受到我的所有同情......並等待着...... DBA協助(我自己也一直在這裏 - 令人沮喪)。如果_waste_長期下降,任何有助於您前進的東西都會很好。我相信你知道這些臨時黑客變得如何輕鬆變成永久黑客。 – user272735