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

时间:2015-08-17 14:06:51

标签: oracle toad

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

我想利用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

where' some_value'是我输入TOAD提示窗口的文字。

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

我打算通过TOAD的SQL编辑器窗口运行它。

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

2 个答案:

答案 0 :(得分:2)

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

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;
/

答案 1 :(得分:0)

鉴于你在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.

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