使用序列构建 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 都应该一致。
错误图片:
如果您只想为每一行取一个唯一值,那么您可以使用 ROWNUM
或 ROW_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 一致值。
干杯!!
我正在尝试从 table 构建一个新的 Oracle 视图。两者之间的唯一区别是我想添加一个具有唯一 ID 的新列。 ID 必须是唯一的,但不需要排序。
我试过 运行 这样的脚本:
CREATE VIEW <VIEW_NAME>
(
ID, VALUE1, VALUE2,...
)
AS
SELECT SEQ1.NEXTVAL, VAL1, VAL2,... FROM <TABLE>
但是,我 运行 犯了错误。 A previous post 提到这实际上是不可能的,但没有详细说明,所以我希望能弄清楚一些。执行 INSERT 似乎没有用,因为我也必须填充所有其他值,至少从我一直在阅读的内容来看是这样。
编辑:我每次查看视图时 ID 都应该一致。
错误图片:
如果您只想为每一行取一个唯一值,那么您可以使用 ROWNUM
或 ROW_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 一致值。
干杯!!