我正在研究一个与Oracle一起使用的相当大的SQL脚本,但我遇到了一个问题。首先,让我概述脚本的运作方式。
现在这个过程似乎适用于只有一个拥有15台服务器的客户,每台服务器有6个服务。但是,只要引入下一个客户,我就会收到变量替换的提示。我在插入中使用变量的方式非常简单:
INSERT INTO SERVERS(CUSTOMER_ID, HOSTNAME)
SELECT CUSTOMERID, 'the.server.i.just.created' FROM DUAL
WHERE NOT EXISTS (
SELECT *
FROM SERVERS
WHERE HOSTNAME = 'the.server.i.just.created'
);
我也尝试使用DECLARE ... BEGIN ... END;
方法,但我收到了相同的一般结果。我见过的一些例子建议使用:CUSTOMERID
样式变量,但那些似乎根本不起作用,它们最终会出现空值,在先前的查询中不应该发生这种情况。 / p>
我需要帮助的是了解如何实现这一目标。我对生产环境的访问非常有限,所以我所做的任何事情都需要保持基本(例如,没有新的功能,类型或程序)。
答案 0 :(得分:3)
我反复在桌子上敲打头后偶然发现了答案。
基本上,发生的事情是一些客户名称中有&符号,紧跟在&符号后面的单词试图绑定为变量。解决方案是SET DEFINE OFF;
,之后一切都很顺利。
感谢大家的时间和考虑。
答案 1 :(得分:1)
您可以使用RETURNING clause来避免某些重新查询。例如:
SQL> var v number
SQL> print v
v
---------
SQL> insert into demo1 (col1) values (12345) returning col1 into :v;
1 row inserted
SQL> print v
v
---------
12345
这在PL / SQL中比在脚本调用的一系列独立语句中更清晰,更易控制。