【问题标题】:Variables in PL/SQLPL/SQL 中的变量
【发布时间】:2010-06-26 22:28:28
【问题描述】:

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

  1. 声明变量
    • `客户编号;`
    • `服务器ID号;`
  2. 如果客户不存在则创建客户
  3. `SELECT ID INTO CUSTOMERID FROM CUSTOMER WHERE NAME = 'The Customer I just Inserted';`
  4. 如果服务器不存在,则创建服务器,使用 `CUSTOMERID` 值将服务器与客户相关联。
  5. `SELECT ID INTO SERVERID WHERE HOSTNAME = 'the.server.i.just.created';`
  6. 对于属于此服务器的每个服务,使用 `SERVERID` 值插入服务以将服务与服务器相关联。
  7. 转到2

现在,这个过程似乎只适用于一个拥有 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 样式变量,但这些似乎根本不起作用,它们以空值结束,考虑到前面的查询,这不应该发生。

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

【问题讨论】:

    标签: oracle plsql oracle10g


    【解决方案1】:

    实际上,我在反复敲打桌子后偶然发现了答案。

    基本上,发生的情况是一些客户名称中包含 & 符号,并且紧跟在 & 符号后面的单词试图绑定为变量。解决方案是SET DEFINE OFF;,之后一切顺利。

    感谢大家的时间和考虑。

    【讨论】:

      【解决方案2】:

      您可以使用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 中往往比在从脚本调用的一系列独立语句中更清晰、更可控。

      【讨论】:

        猜你喜欢
        • 2016-02-18
        • 1970-01-01
        • 1970-01-01
        • 2013-05-29
        • 2012-10-11
        • 1970-01-01
        • 2015-07-08
        • 2012-03-30
        • 1970-01-01
        相关资源
        最近更新 更多