【问题标题】:compare a single value against a list of values stored in a cursor in Oracle PL/SQL将单个值与存储在 Oracle PL/SQL 游标中的值列表进行比较
【发布时间】:2018-01-09 13:52:00
【问题描述】:

如果我得到的VALUE 大于游标中的每个值,我想执行插入语句。请看以下内容:

我有一个非常标准的光标,其中包含日期值列表:

set REF_CUR cursor for select BIRTHDAY from PEOPLE_TABLE where school='middle';
IF VALUE>ALL(REF_CUR)
   insert something into something;
END IF;

所以我知道这个游标只包含一列 BIRTHDAY 和很多行,我想知道它们是否都比 VALUE 大,我无法让 ALL 工作。

【问题讨论】:

  • 值不存储在游标中。游标是对要获取的行的规范 - 它必须由某个客户端打开和获取。

标签: database plsql list-comparison


【解决方案1】:

你这样使用ALL函数可能不会成功,你可能会得到以下错误:

PLS-00204:函数或伪列 '>ALL' 只能在 SQL 语句中使用

但你不需要它。我建议你使用max 函数:

select max(BIRTHDAY)
  into l_max_birthday 
  from PEOPLE_TABLE 
 where school='middle';
if VALUE > l_max_birthday then
  insert something into something;
end if;

【讨论】:

    【解决方案2】:

    您可以在一个insert ... select ... 声明中实现:

    insert into something (...)
    select <some values>
      from PEOPLE_TABLE 
     where school = 'middle'
    having VALUE > max(BIRTHDAY);
    

    如果VALUE 大于BIRTHDAY 列的最大值,则此SELECT 语句返回1 行,将立即插入。如果不是,则查询返回 0 行并插入 0 行。

    &lt;some values&gt; 可以是静态值或变量,而不仅仅是PEOPLE_TABLE 的列。

    如果需要,类似的技术允许您插入多行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多