在Oracle SQL Developer

时间:2016-04-18 18:35:28

标签: sql oracle oracle-sqldeveloper

我需要查询。它需要从列中不存在的列表中选择每个数字。目前,我的工作正常。此查询返回18332000之间ATTR表中不存在的每个数字。

SELECT LEVEL + 1833
FROM   DUAL
CONNECT BY LEVEL <= (2000 - 1833)
MINUS
SELECT ID_TX
FROM   ATTR
WHERE  ID_TX BETWEEN 1834 AND 2000;

我想要做的是尽可能使用户友好。为此,我可以输入两个变量,STARTING_IDLIST_LENGTH。现在我的查询看起来像这样。

SELECT LEVEL + &STARTING_ID
FROM   DUAL
CONNECT BY LEVEL <= &LIST_LENGTH
MINUS
SELECT ID_TX
FROM   ATTR
WHERE  ID_TX BETWEEN &STARTING_ID AND &STARTING_ID + &LIST_LENGTH;

起初,我使用的是&&,但之后我只能使用此查询一次。 UNDEFINE无法放在代码块中,无论如何都无法清理我的变量。现在我的问题是它认为每个&变量都不同,所以它让用户输入5个变量而不是2个。

如何使用临时变量(使用或不使用弹出框输入变量),但运行查询的人只需要输入两个值1833和{{ 1}}?

3 个答案:

答案 0 :(得分:2)

有点软糖,但如果你想要提示替换变量那么你可以使用绑定变量,但只需使用这样的替换变量填充它们:

(使用 F5 作为脚本运行,而不是使用 Ctrl + Enter 作为语句)

VARIABLE list_length NUMBER;
VARIABLE start_value NUMBER;

BEGIN
  :list_length := &ll;
  :start_value := &sv;
END;
/

SELECT LEVEL + :start_value
FROM   DUAL
CONNECT BY LEVEL <= :list_length
MINUS
SELECT ID_TX
FROM   ATTR
WHERE  ID_TX BETWEEN :start_value + 1 AND :start_value + :list_length;

否则,只需使用绑定变量(即脚本底部的查询)。

答案 1 :(得分:1)

如何使用:as prompt?

SELECT LEVEL + :STARTING_ID
FROM   DUAL
CONNECT BY LEVEL <= :LIST_LENGTH
MINUS
SELECT ID_TX
FROM   ATTR
WHERE  ID_TX BETWEEN :STARTING_ID AND :STARTING_ID + :LIST_LENGTH;

这采用了绑定变量的概念。因此,用户可以输入必要的值并继续。

enter image description here

enter image description here

答案 2 :(得分:0)

尝试使用'&amp;&amp;'而不是一个'&amp;'。

如果单个&符号前缀与未定义变量一起使用,则不会存储在提示符处输入的值。因此,一旦替换了alue,变量将被丢弃并保持未定义。如果变量被引用两次,即使在同一语句中,也会提示您两次。

如果您使用'&amp;&amp;',则会存储该值,因此系统只会提示您一个。