如何在SQL Developer中将替代变量设置为查询结果?

3

我想在Oracle的SQL Developer (v17.2)中对一个Oracle 12c数据库执行类似如下的操作:

define thisenv = '(select name from v$database)'
select &thisenv env, count(1) from phone;

我希望选择返回类似这样的内容:
ENV      COUNT(1)
------ ----------
Dev1            7

如果我使用我的示例代码,会告诉我需要一个group by子句,因为它正在看到查询而不是查询结果的字符串字面量。但是添加group by对我没有用。

根据这个问题的答案,我尝试将第一行替换为:

column dummyenv new_value thisenv
select name dummyenv from v$database;

我还尝试使用绑定变量,但是我仍然需要输入thisenv的值。所以那些选项都不起作用。

我应该尝试什么其他方法呢?

PHONE表的样式如下:

PHONEID PERSONID PHONENUM     TYPE
------- -------- ------------ ----
899250  ABC12345 123-456-7890 WORK

你能展示一下 phone 表的结构吗? - wolφi
2个回答

1

不用担心替换变量 - 您将从以下SQL语句开始,该语句在语法上是不正确的:

select ( select name from ... ), count(1) from ...

- 这不是由于使用替代变量而导致失败,而是一个简单的SQL语句导致了失败。
如果您想要输出(如您所示),请将查询重写为
select name, ct
from   (select name from v$database)
       cross join
       (select count(1) as ct from phone);

现在如果需要,您可以使用替换变量:
SQL> define thisenv = '(select name from v$database)'
SQL> select name, ct
  2  from   &thisenv
  3  cross join
  4  (select count(1) as ct from phone);

当然,当我在我的机器上运行这个程序时会出现错误(因为我没有一个名为PHONE的表),但它应该可以正常工作。当我使用一个已存在的表名时,它对我有效。

0
你可以在一个标量子查询中计算手机数量:
SELECT name, 
       (SELECT count(*) FROM phone) as phones
  FROM v$database;

或者,由于视图v$database的选择权限通常不被授予,因此您可以使用函数sys_context。因为它是一个标量,所以只需将其放入查询中:

SELECT sys_context('userenv', 'db_name') as db_name, count(*)
  FROM phone;

1
尝试过了,但是我仍然需要按组分组。 - Preacher
哦,亲爱的,你说得完全正确。抱歉!已修复查询。 - wolφi
但那不是你想要的。我会删除这个答案,好吗? - wolφi
1
我尝试了sys_context(),它起作用了。 define thisenv = 'sys_context(''userenv'',''db_name'')' - Preacher
1
我意识到这个答案并没有回答我问题的更一般性质,但它满足了眼前的需求。而且所提供的函数表明我可以将查询编码为一个函数并调用该函数。 - Preacher

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接