努力使用替代变量编写 Oracle Sql 查询

Struggling to write Oracle Sql Query using Substitution Variables

我正在尝试处理一些更复杂的查询,并尽可能使它们对用户友好。出于各种原因,我们不能't/would 不希望将它们烘焙到架构中。因此,我正在尝试编写一个查询版本,我们必须定期 运行 以简化输入某些参数。我目前的选择是每次我必须 运行 时 find-replace 相关值,这不太理想。

我想利用 TOAD 对替代变量的支持(如果其中之一存在,它会提示用户输入预期值,然后 运行 整个查询)。

我已尝试设置一个测试查询来熟悉该过程,但它的表现不如预期。

DECLARE
   &&v_value   VARCHAR2 (200);
   v_result   VARCHAR2 (200);
BEGIN

select &v_value into v_result from dual;
dbms_output.PUT_LINE('result :'|| to_char(v_result));
END;

结果是

result :

这当然不太理想。我的期望是

result : some_value

其中 'some_value' 是我在 TOAD 提示 window 中输入的文本。

我需要它工作的原因是我们可以将其视为一个过程并将它传递一次所需的值并在我们必须 运行 的一系列查询中使用它。我不是很熟悉或不擅长构建这些查询的孩子,所以任何帮助或指导将不胜感激。

我正计划通过 TOAD 的 SQL 编辑器 运行 编辑它 window。

我需要 运行 的实际过程实际上是一系列更新和插入;我使用 select 作为测试用例,以确保我了解如何使用它们。

您似乎在为参数赋值时遇到了问题。我会使用以下语法,因为它既避免了不必要的上下文切换,又允许您对传递的值进行异常处理。

DECLARE
   v_value  VARCHAR2(200);
   v_result VARCHAR2(200);
BEGIN
   v_value := '&input';
   v_result := v_value;
   dbms_output.put_line('result : ' || v_result);
END;
/

考虑到您正在 运行在 Toad 中执行一系列 select 语句 - 大概是一个脚本 - 我根本不明白为什么您需要一个过程。

您可以像这样在查询中使用参数(确保 运行 作为脚本):

set verify on;

select '&&v_val' value from dual;

select * from dual
where  dummy = '&&v_val';

old: select '&&v_val' value from dual
new: select 'X' value from dual

VALUE
-----
X    
1 row selected.


old: select * from dual
where  dummy = '&&v_val'
new: select * from dual
where  dummy = 'X'

DUMMY
-----
X    
1 row selected.

(我特意将验证设置为打开,以便您可以看到将上述两个语句作为脚本 运行 时发生的结果;您可能更愿意将其关闭。)