所以在工作中我们最近一直在使用Oracle SQL Developer 4.1.3.20来查询我们的数据,所以我编写了这段代码(它实际上更长了8个左右的表连接):
select
s.NAME as "Shipment ID"
,k.STATUS_ID as "Status"
,u.SCR_NO as "SPID"
from xyz.DRUG_KIT k
left join xyz.DR_SHIP s on s.ID = k.SHIPMENT_ID
left join xyz.USR_PAT u on u.PAT_ID = k.PAT_ID
当我不得不切换到另一个数据库中的另一个表时,我一直在上面复制粘贴到你看到'xyz'的地方,但肯定还有更好的方法吗?我使用SQL Server Management Studio 2014,但是一旦我们开始使用oracle数据库,我们就不得不切换到这一点。我如何在Oracle SQL Developer中声明一个varchar(?)变量,这样我就可以用一个变量代替XYZ,在查询的顶部,我可以将该变量设置为在一个地方有必要,如果有意义的话。当我试图将10个以上的表连接在一起以检索数据时,我在一行上复制粘贴错误时会变得很麻烦。
答案 0 :(得分:0)
在数据库级别,您可能需要公共同义词。 https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_7001.htm
答案 1 :(得分:0)
XYZ是表的所有者,而不是其他数据库。如果您以XYZ用户身份连接,那么您不需要将XYZ作为表名前缀,只有在您尝试访问由不同“SCHEMA”拥有的对象时才需要它。
您可以通过发出alter session命令来更改会话的当前“解析”架构:
ALTER SESSION SET CURRENT_SCHEMA=PDQ;
然后从用户PDQ授予您的对象中选择以下内容选择权限:
select
s.NAME as "Shipment ID"
,k.STATUS_ID as "Status"
,u.SCR_NO as "SPID"
from DRUG_KIT k
left join DR_SHIP s on s.ID = k.SHIPMENT_ID
left join USR_PAT u on u.PAT_ID = k.PAT_ID;
然后,您可以将架构更改回XYZ并执行相同的select语句,并根据XYZ拥有的表的内容获得不同的结果:
ALTER SESSION SET CURRENT_SCHEMA=XYZ;
select
s.NAME as "Shipment ID"
,k.STATUS_ID as "Status"
,u.SCR_NO as "SPID"
from DRUG_KIT k
left join DR_SHIP s on s.ID = k.SHIPMENT_ID
left join USR_PAT u on u.PAT_ID = k.PAT_ID;
要使PDQ拥有的DR_SHIP表可从XYZ模式访问,可以创建PDQ.DR_SIP的私有同义词来代替XYZ onwed表:
CREATE OR REPLACE SYNONYM DR_SHIP FOR PDQ.DR_SHIP;
另一方面,如果您希望从DB中的所有SCHEMA访问DRUG_KIT表的PDQ版本,您可以创建公共同义词:
CREATE OR REPLACE PUBLIC SYNONYM DRUG_KIT FOR PDQ.DRUG_KIT;
如果以上都不符合您的需求,您可以使用SQL * Plus样式替换变量:
ACCEPT user;
select
s.NAME as "Shipment ID"
,k.STATUS_ID as "Status"
,u.SCR_NO as "SPID"
from &user..DRUG_KIT k
left join &user..DR_SHIP s on s.ID = k.SHIPMENT_ID
left join &user..USR_PAT u on u.PAT_ID = k.PAT_ID;
但是你需要明白,这些不一定适用于SQL * Plus,SQL Developer,SQLcl以及其他一些SQL开发环境。