2014-06-30 87 views
1

我知道這是倒退,而是說我們有一個不靈活的工具或情況總是會在形式直接引用公共同義詞Oracle中

SELECT * FROM ${SCHEMA}.${TABLE}; 

現在說我們有一個表公共同義詞SELECT語句稱爲MY_TABLE,但在當前模式中沒有實際的MY_TABLE。這是我們的用戶是USER,但MY_TABLE的同義詞指向OTHER_USER.MY_TABLE。

請注意,這可以正常工作:select * from MY_TABLE UNION ALL select * from OTHER_USER.MY_TABLE;

我想這樣做

SELECT * FROM SYNONYMS.${TABLE}; 

有什麼我們可以放在$ {} SCHEMA將迫使甲骨文發現並解決的代名詞?我嘗試了以下文字 SQL語句試圖直接引用同義詞,但它們不起作用。

select count(*) from USER.MY_TABLE; 

select count(*) from CURRENT_SCHEMA.MY_TABLE; 

select count(*) from .MY_TABLE; 

select count(*) from %.MY_TABLE; 

請注意,我們必須參照代名詞,因爲我們改變同義詞經常以幫助生產安裝,因此我不能只把OTHER_USER在$ SCHEMA,因爲它可能是OTHER_USER或OTHER_USER2或OTHER_USER3用於之外的原因我的代碼的控制。

+0

在用戶問題中,用戶是USER函數,還是實際用戶名 - 如果後者是否可以在問題中使用「USERA」來避免含糊不清? –

+0

是的。因爲我的代碼在這種情況下必須有一些東西。這是一個愚蠢的情況,但將SOMETHING放在這裏將是處理僵化工具的最簡單/最好的方式。但是,'從SYS.MY_TABLE選擇計數(*)「沒有工作:('ORA-00942:表或視圖不存在' – bot403

+0

嗯,是的,我應該檢查;你可以描述一個表,但不能從中選擇。 –

回答

0

我並不真正瞭解您的基本動機,但正如我所看到的那樣,您可能會考慮使用專用用戶架構並在該架構內創建引用最終對象的視圖。視圖可以用作符號鏈接。

爲什麼不能:

select count(*) from USER.MY_TABLE; 

指的是用戶的方案名爲MY_TABLE一種觀點認爲,是指任何表目前是必要的。您可以重新創建視圖而不是重新命名同義詞。

create view USER.MY_TABLE 
    as select * from OTHER_USER.MY_TABLE; 
0

據我所知,似乎沒有一個字面值,我們可以使用$ {SCHEMA}。但是,我們可以靈活地以這種方式查找模式所有者,保存值,然後在$ {SCHEMA}中使用該值。

select TABLE_OWNER from all_synonyms where TABLE_NAME='MY_TABLE' and OWNER='PUBLIC'; 

該查詢正確返回OTHER_USER,我們可以使用它。

2

您可以使用同義詞所有者PUBLIC作爲參考模式;爲USERA

create table t42 (id number); 
create public synonym t42 for t42; 
grant select on t42 to userb; 

然後爲USERB

select * from "PUBLIC"."T42"; 

no rows selected 

但好像在 '模式' 有被引用:

select * from public.t42; 
select * from public.t42 
       * 
ERROR at line 1: 
ORA-00903: invalid table name 


select * from "PUBLIC".t42; 

no rows selected 

可能會或可能不會對您可能。如果你可以用等於"PUBLIC",用雙引號,那麼它可以解決你的問題。

我不確定爲什麼必須引用它,大寫標識符通常不會;但PUBLIC不是普通用戶,所以也許應該不需要特別的處理。