使用序列构建 Oracle 视图

Building an Oracle view with a sequence

我正在尝试从 table 构建一个新的 Oracle 视图。两者之间的唯一区别是我想添加一个具有唯一 ID 的新列。 ID 必须是唯一的,但不需要排序。

我试过 运行 这样的脚本:

CREATE VIEW <VIEW_NAME>
(
ID, VALUE1, VALUE2,...
)
AS
   SELECT SEQ1.NEXTVAL, VAL1, VAL2,... FROM <TABLE>

但是,我 运行 犯了错误。 A previous post 提到这实际上是不可能的,但没有详细说明,所以我希望能弄清楚一些。执行 INSERT 似乎没有用,因为我也必须填充所有其他值,至少从我一直在阅读的内容来看是这样。

编辑:我每次查看视图时 ID 都应该一致。

错误图片:

如果您只想为每一行取一个唯一值,那么您可以使用 ROWNUMROW_NUMBER 分析函数:

CREATE VIEW view_name ( ID, VALUE1, VALUE2,... ) AS
   SELECT ROWNUM,
          VAL1,
          VAL2,
          ...
   FROM   table_name

CREATE VIEW view_name ( ID, VALUE1, VALUE2,... ) AS
   SELECT ROW_NUMBER() OVER ( ORDER BY val1, val2 ),
          VAL1,
          VAL2,
          ...
   FROM   table_name

IDs should be consistent every time I look at the view.

我认为这是不可能的;您需要将 ID 存储在某处,这需要 table 而不是 view/sequence.

例如:

Oracle 设置:

CREATE TABLE table_name ( val1, val2 ) AS
  SELECT 1, 'a' FROM DUAL UNION ALL
  SELECT 2, 'b' FROM DUAL

CREATE SEQUENCE view_name__seq;

CREATE FUNCTION seq_value RETURN NUMBER
IS
BEGIN
  RETURN view_name__seq.NEXTVAL;
END;
/

CREATE VIEW view_name ( id, value1, value2 ) AS
  SELECT seq_value, val1, val2 FROM table_name;

如果您 select 第一次观看:

SELECT * FROM view_name;

你得到:

ID | VALUE1 | VALUE2
-: | -----: | :-----
 1 |      1 | a     
 2 |      2 | b     

第二次你得到:

ID | VALUE1 | VALUE2
-: | -----: | :-----
 3 |      1 | a     
 4 |      2 | b     

db<>fiddle here

ID不一致

我建议您在基础中使用 INVISIBLE 列 table。

ALTER TABLE MY_TABLE ADD MY_UNIQUE_ID NUMBER INVISIBLE;

现在,为其分配序列号或用作 GENERATED AS IDENTITY(试试这个)

这不会破坏您的应用程序,您可以在您的视图中使用它来实现所需的结果和视图中的 return 一致值。

干杯!!