Oracle SQL WHERE子句中的序号

tjvv9vkg  于 2023-10-16  发布在  Oracle
关注(0)|答案(2)|浏览(114)

如果我想在WHERE子句中使用序列号,该怎么办?
在这里,我想使用WHERE子句中序列所指定的最后一个值

CREATE SEQUENCE my_no_s
    INCREMENT BY 5
    START WITH 100;

INSERT INTO myTable VALUES (
    my_no_s.NEXTVAL,
    TO_DATE('2023/10/03', 'yyyy/mm/dd')
    3
);

INSERT INTO myTable (m_no, m_datetime, m_roomno)
SELECT  my_no_s.NEXTVAL,
        my_datetime + 10,
        my_roomno
FROM myTable
WHERE my_no = my_no_s.CURRVAL - 5;
stszievb

stszievb1#

你尝试了,但失败了--这是意料之中的,因为序列使用上有某些限制。看一下文档,

序列值限制

不能在以下构造中使用CURRVAL和NEXTVAL:
(...)
SELECT语句的WHERE子句
你已经得到了一个答案(匿名PL/SQL块)。另一个可能是你自己的函数,它返回那个值。
样品表和序列:

SQL> CREATE TABLE mytable
  2  (
  3     m_no         NUMBER,
  4     m_datetime   DATE,
  5     m_roomno     NUMBER
  6  );

Table created.

SQL> CREATE SEQUENCE my_no_s INCREMENT BY 5 START WITH 100;

Sequence created.

初始行:

SQL> INSERT INTO myTable
  2       VALUES (my_no_s.NEXTVAL, TO_DATE ('2023/10/03', 'yyyy/mm/dd'), 3);

1 row created.

功能说明:

SQL> CREATE OR REPLACE FUNCTION f_curval
  2     RETURN NUMBER
  3  AS
  4     retval  NUMBER;
  5  BEGIN
  6     SELECT my_no_s.CURRVAL INTO retval FROM DUAL;
  7
  8     RETURN retval;
  9  EXCEPTION
 10     WHEN OTHERS
 11     THEN
 12        RETURN NULL;
 13  END;
 14  /

Function created.

这是你的第二次尝试(失败了),但是现在-在第4行-它调用了一个函数。我还修改了你使用的常量(0而不是5),因为该表中没有更多的行,所以where将导致此时插入0行):

SQL> INSERT INTO myTable (m_no, m_datetime, m_roomno)
  2     SELECT my_no_s.NEXTVAL, m_datetime + 10, m_roomno
  3       FROM myTable
  4      WHERE m_no = f_curval - 0;

1 row created.

SQL>
bprjcwpo

bprjcwpo2#

您可以使用匿名PL/SQL块

DECLARE
seq_curr_value NUMBER;
BEGIN

  -- Select current value of sequence
  SELECT my_no_s.CURRVAL INTO seq_curr_value FROM dual;
  
  INSERT INTO myTable (m_no, m_datetime, m_roomno)
  SELECT  my_no_s.NEXTVAL,
          m_datetime + 10,
          m_roomno
  FROM myTable
  WHERE m_no = seq_curr_value - 5;
END;
/

PS:你必须在选择列表中编辑你的列名。
例如:不是my_datetime而是m_datetime等等。

相关问题