PL / SQL中的变量

时间:2010-06-25 19:48:03

标签: oracle plsql oracle10g

我正在研究一个与Oracle一起使用的相当大的SQL脚本,但我遇到了一个问题。首先,让我概述脚本的运作方式。

  1. 声明变量
    • `CUSTOMERID NUMBER;`
    • `SERVERID NUMBER;`
  2. 如果客户不存在,则创建
  3. `从客户中选择ID IN IN CUSTOMERID,其中NAME ='我刚插入的客户';`
  4. 如果服务器不存在,请使用`CUSTOMERID`值将服务器与客户关联。
  5. `SELECT ID INTO SERVERID WHERE HOSTNAME ='the.server.i.just.created';`
  6. 对于属于此服务器的每个服务,使用`SERVERID`值插入服务以将服务与服务器相关联。
  7. 转到2
  8. 现在这个过程似乎适用于只有一个拥有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>

    我需要帮助的是了解如何实现这一目标。我对生产环境的访问非常有限,所以我所做的任何事情都需要保持基本(例如,没有新的功能,类型或程序)。

2 个答案:

答案 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中比在脚本调用的一系列独立语句中更清晰,更易控制。