【问题标题】:declare and use a string variable in oracle sql developer 4.1.3.20在 oracle sql developer 4.1.3.20 中声明和使用字符串变量
【发布时间】:2016-12-14 06:15:43
【问题描述】:

所以在工作中,我们最近一直在使用 Oracle SQL Developer 4.1.3.20 来查询我们的数据,所以我编写了这段 sn-p 代码(实际上要长 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 多个表连接在一起以检索数据时,当我在一行上复制粘贴错误时会变得很麻烦。

【问题讨论】:

  • 你对查询的数据做了什么?您是否只是目视检查它,将其插入某处等?
  • 您可以使用动态 SQL 来执行此操作。但正如 JBC 所问,您打算如何处理结果?
  • 对不起,我没有收到任何通知到我的收件箱,正如我预期的那样(我现在是写这个问题后的第一次登录,也许它进入了我的垃圾邮件) 但我对数据所做的只是检查和/或查看它。我基本上在工作中加入这些表,以帮助加快查找我们的开发人员在编码系统时使用的 Oracle 表的特定数据更改。
  • 您好,我刚刚留下了很长的回复,但它都消失了。当我离开他们时,我的 cmets 没有保存/提交吗?抱歉,我还是这个社区的新手。

标签: sql oracle oracle-sqldeveloper


【解决方案1】:

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 并执行相同的选择语句并根据 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 继承的表:

CREATE OR REPLACE SYNONYM DR_SHIP FOR PDQ.DR_SHIP;

另一方面,如果您希望从数据库中的所有 SCHEMA 访问 PDQ 版本的 DRUG_KIT 表,您可以创建一个公共同义词:

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 开发环境。

【讨论】:

  • 我正在尝试按照您所说的进行操作,但在顶部当您说:“如果您以用户 XYZ 的身份连接,那么您不需要在表名称前加上 XYZ 前缀”
  • 这并不完全正确。我根本不是数据库管理员,但希望我可以将其解释为更有意义的地方,但我必须添加 xyz 部分,因为如果我不这样做,oracle sql developer 不知道我是什么试图访问。除了对我要说的内容进行某种屏幕截图之外,这有点超出了我的理解范围,我们的 DBA 在安排 oracle 表时做了什么我们用来连接到架构但现在我们都有一个架构连接到它下面的所有不同项目及其各自的表。
  • 我在上面的意思是说,我们使用它连接到每个单独的项目模式及其各自的表,但现在我们连接到一个模式,我们的所有项目都位于一个名为“其他用户”的部分下方,并且从那里我们可以打开“其他用户”中的每个项目来查看表格。这有帮助吗?
  • 好的,您所描述的是您的登录帐户架构与表所有者架构不同的常见情况。例如,您以用户 ABC 的身份登录,但用户 XYZ 拥有应用程序中的一些表(和视图),并且可能其他用户(PDQ?)拥有其他表。要访问其他用户的表和视图,您需要在表/视图前面加上拥有模式的名称,或者为对象创建同义词(公共或私有),或者根据需要更改解析模式。上面显示了每个选项。
  • 好的,我尝试了上面的示例: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; 但我得到一个弹出框,说明为用户输入值,所以在文本框中我输入了用户名,在我的示例中是xyz 但是当我单击“确定”时,它再次询问我(我认为对于我加入的每个表)但是在我的第三个条目之后,我收到一个错误,指出无效的表名。我遗漏了什么吗?
【解决方案2】:

在数据库级别,您可能需要公共同义词。 https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_7001.htm

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    相关资源
    最近更新 更多