我尝试使用一些更复杂的查询,并尽可能使用户友好。由于各种原因,我们不希望不将它们烘焙到架构中。因此,我试图编写一个查询版本,我们必须定期运行以简化输入一些参数。我目前的选择是每次运行时都找到 - 替换相关的值,这不太理想。
我想利用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作为测试用例来确保我理解如何使用它们。
答案 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.
(我故意将验证设置为打开,以便您可以看到将上述两个语句作为脚本运行时会发生什么结果;您可能更愿意将其关闭。)