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

时间:2018-05-30 20:33:20

标签: sql oracle oracle-sqldeveloper

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

ENV      COUNT(1)
------ ----------
Dev1            7

我希望select返回这样的内容:

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

如果我使用我的示例代码,有效地告诉我,我需要一个group by子句,因为它看到的是查询而不是查询结果的字符串文字。但添加一个小组并不适合我。

根据this question的答案,我尝试用

替换第一行
PHONEID PERSONID PHONENUM     TYPE
------- -------- ------------ ----
899250  ABC12345 123-456-7890 WORK

我也试过使用绑定变量,但我仍然会提示输入thisenv的值。所以,这些选择都不起作用。

我还应该尝试什么?

PHONE表如下所示:

public class DatePickerDialogFragment extends DialogFragment  {

    private static final String ARGUMENT_YEAR = "ARGUMENT_YEAR";
    private static final String ARGUMENT_MONTH = "ARGUMENT_MONTH";
    private static final String ARGUMENT_DAY = "ARGUMENT_DAY";
    private DatePickerDialog.OnDateSetListener listener;

    private int year;
    private int month;
    private int dayOfMonth;

    public static DatePickerDialogFragment newInstance(final int year, final int month, final int dayOfMonth) {
        final DatePickerDialogFragment df = new DatePickerDialogFragment();
        final Bundle args = new Bundle();
        args.putInt(ARGUMENT_YEAR, year);
        args.putInt(ARGUMENT_MONTH, month);
        args.putInt(ARGUMENT_DAY, dayOfMonth);
        df.setArguments(args);
        return df;
    }

    @Override
    public void onCreate(@Nullable final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        retrieveArguments();
    }

    private void retrieveArguments() {
        final Bundle args = getArguments();
        if (args != null) {
            year = args.getInt(ARGUMENT_YEAR);
            month = args.getInt(ARGUMENT_MONTH);
            dayOfMonth = args.getInt(ARGUMENT_DAY);
        }
    }

    @Override
    public Dialog onCreateDialog(final Bundle savedInstanceState) {
        return new DatePickerDialog(getContext(), this.listener, this.year, this.month, this.dayOfMonth);
    }

    public void setListener(final DatePickerDialog.OnDateSetListener listener) {
        this.listener = listener;
    }
}

2 个答案:

答案 0 :(得分: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 :(得分:0)

别介意替换变量 - 您从以下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),但它应该适合你。当我使用现有的表名时,它对我有用。