我需要查询。它需要从列中不存在的列表中选择每个数字。目前,我的工作正常。此查询返回1833
和2000
之间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_ID
和LIST_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}}?
答案 0 :(得分:2)
有点软糖,但如果你想要提示替换变量那么你可以使用绑定变量,但只需使用这样的替换变量填充它们:
(使用 F5 作为脚本运行,而不是使用 Ctrl + Enter 作为语句)
VARIABLE list_length NUMBER;
VARIABLE start_value NUMBER;
BEGIN
:list_length := ≪
: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;
这采用了绑定变量的概念。因此,用户可以输入必要的值并继续。
答案 2 :(得分:0)
尝试使用'&amp;&amp;'而不是一个'&amp;'。
如果单个&符号前缀与未定义变量一起使用,则不会存储在提示符处输入的值。因此,一旦替换了alue,变量将被丢弃并保持未定义。如果变量被引用两次,即使在同一语句中,也会提示您两次。
如果您使用'&amp;&amp;',则会存储该值,因此系统只会提示您一个。