Oracle 创建嵌套表并仅在内部表中插入数据

Oracle 创建嵌套表并仅在内部表中插入数据,oracle,plsql,Oracle,Plsql,我有一个表:employees(id、firstname、lastname、salary),我添加了另一个列来存储每个员工过去的所有工资 CREATE OR REPLACE TYPE salary_list AS TABLE OF NUMBER; / ALTER TABLE employees ADD (salary_history salary_list) NESTED TABLE salary_history STORE AS salary_history_tab; 现在,该表是emplo

我有一个表:employees(id、firstname、lastname、salary),我添加了另一个列来存储每个员工过去的所有工资

CREATE OR REPLACE TYPE salary_list AS TABLE OF NUMBER;
/
ALTER TABLE employees
ADD (salary_history salary_list)
NESTED TABLE salary_history STORE AS salary_history_tab;
现在,该表是employees(id、firstname、lastname、salary、salary\u history),salary\u history为空。修改salaray值时,如何将当前薪资值插入内部表格salary\u history?我尝试过:

INSERT INTO 
TABLE(SELECT salary_history FROM employees WHERE id=1) 
VALUES(1500);
我得到以下错误:

ORA-22908:对空表值的引用

是的,嵌套表salary\u history为空,因为我刚刚创建了它。我做错了什么?通过id将值(附加到现有数据)插入工资\ U历史记录以识别员工的正确方法是什么

更新: 添加了nvl(,()),如下所示:

我现在得到的错误是:

ORA-25015:无法在此嵌套表视图列上执行DML


该列当前为空,而不是空表;您可以创建一个空的嵌套表来开始:

UPDATE employees
SET salary_history = NEW salary_list()
WHERE id = 1;

1 row updated.
那么你的第一句话就行了:

INSERT INTO 
TABLE(SELECT salary_history FROM employees WHERE id=1) 
VALUES(1500);

1 row inserted.
您可以看到新值:

SELECT * FROM employees;

        ID FIRSTNAME  LASTNAME       SALARY SALARY_HISTORY                
---------- ---------- ---------- ---------- ------------------------------
         1 Joe        BLoggs           1234 SALARY_LIST(1500)             

该列当前为空,而不是空表;您可以创建一个空的嵌套表来开始:

UPDATE employees
SET salary_history = NEW salary_list()
WHERE id = 1;

1 row updated.
那么你的第一句话就行了:

INSERT INTO 
TABLE(SELECT salary_history FROM employees WHERE id=1) 
VALUES(1500);

1 row inserted.
您可以看到新值:

SELECT * FROM employees;

        ID FIRSTNAME  LASTNAME       SALARY SALARY_HISTORY                
---------- ---------- ---------- ---------- ------------------------------
         1 Joe        BLoggs           1234 SALARY_LIST(1500)             
您可以使用
合并(salary_history,salary_list())多集联合所有salary_list(:您的新值)
将新值附加到旧列表中(如果不存在,则创建新列表)

Oracle 11g R2架构设置

CREATE OR REPLACE TYPE salary_list AS TABLE OF NUMBER;
/

CREATE TABLE employees(
  id             NUMBER,
  salary_history salary_list
) NESTED TABLE salary_history STORE AS salary_history_tab
/

INSERT INTO employees VALUES ( 1, NULL )
/
UPDATE employees
SET   salary_history = COALESCE( salary_history, salary_list() )
                       MULTISET UNION ALL salary_list( 500 )
WHERE id = 1

SELECT * FROM employees
| ID | SALARY_HISTORY |
|----|----------------|
|  1 |            500 |
UPDATE employees
SET   salary_history = COALESCE( salary_history, salary_list() )
                       MULTISET UNION ALL salary_list( 700 )
WHERE id = 1

SELECT * FROM employees
| ID | SALARY_HISTORY |
|----|----------------|
|  1 |        500,700 |
UPDATE employees
SET   salary_history = COALESCE( salary_history, salary_list() )
                       MULTISET UNION ALL salary_list( 500 )
WHERE id = 1

SELECT * FROM employees
| ID | SALARY_HISTORY |
|----|----------------|
|  1 |    500,700,500 |
查询1

CREATE OR REPLACE TYPE salary_list AS TABLE OF NUMBER;
/

CREATE TABLE employees(
  id             NUMBER,
  salary_history salary_list
) NESTED TABLE salary_history STORE AS salary_history_tab
/

INSERT INTO employees VALUES ( 1, NULL )
/
UPDATE employees
SET   salary_history = COALESCE( salary_history, salary_list() )
                       MULTISET UNION ALL salary_list( 500 )
WHERE id = 1

SELECT * FROM employees
| ID | SALARY_HISTORY |
|----|----------------|
|  1 |            500 |
UPDATE employees
SET   salary_history = COALESCE( salary_history, salary_list() )
                       MULTISET UNION ALL salary_list( 700 )
WHERE id = 1

SELECT * FROM employees
| ID | SALARY_HISTORY |
|----|----------------|
|  1 |        500,700 |
UPDATE employees
SET   salary_history = COALESCE( salary_history, salary_list() )
                       MULTISET UNION ALL salary_list( 500 )
WHERE id = 1

SELECT * FROM employees
| ID | SALARY_HISTORY |
|----|----------------|
|  1 |    500,700,500 |

CREATE OR REPLACE TYPE salary_list AS TABLE OF NUMBER;
/

CREATE TABLE employees(
  id             NUMBER,
  salary_history salary_list
) NESTED TABLE salary_history STORE AS salary_history_tab
/

INSERT INTO employees VALUES ( 1, NULL )
/
UPDATE employees
SET   salary_history = COALESCE( salary_history, salary_list() )
                       MULTISET UNION ALL salary_list( 500 )
WHERE id = 1

SELECT * FROM employees
| ID | SALARY_HISTORY |
|----|----------------|
|  1 |            500 |
UPDATE employees
SET   salary_history = COALESCE( salary_history, salary_list() )
                       MULTISET UNION ALL salary_list( 700 )
WHERE id = 1

SELECT * FROM employees
| ID | SALARY_HISTORY |
|----|----------------|
|  1 |        500,700 |
UPDATE employees
SET   salary_history = COALESCE( salary_history, salary_list() )
                       MULTISET UNION ALL salary_list( 500 )
WHERE id = 1

SELECT * FROM employees
| ID | SALARY_HISTORY |
|----|----------------|
|  1 |    500,700,500 |
查询2

CREATE OR REPLACE TYPE salary_list AS TABLE OF NUMBER;
/

CREATE TABLE employees(
  id             NUMBER,
  salary_history salary_list
) NESTED TABLE salary_history STORE AS salary_history_tab
/

INSERT INTO employees VALUES ( 1, NULL )
/
UPDATE employees
SET   salary_history = COALESCE( salary_history, salary_list() )
                       MULTISET UNION ALL salary_list( 500 )
WHERE id = 1

SELECT * FROM employees
| ID | SALARY_HISTORY |
|----|----------------|
|  1 |            500 |
UPDATE employees
SET   salary_history = COALESCE( salary_history, salary_list() )
                       MULTISET UNION ALL salary_list( 700 )
WHERE id = 1

SELECT * FROM employees
| ID | SALARY_HISTORY |
|----|----------------|
|  1 |        500,700 |
UPDATE employees
SET   salary_history = COALESCE( salary_history, salary_list() )
                       MULTISET UNION ALL salary_list( 500 )
WHERE id = 1

SELECT * FROM employees
| ID | SALARY_HISTORY |
|----|----------------|
|  1 |    500,700,500 |

CREATE OR REPLACE TYPE salary_list AS TABLE OF NUMBER;
/

CREATE TABLE employees(
  id             NUMBER,
  salary_history salary_list
) NESTED TABLE salary_history STORE AS salary_history_tab
/

INSERT INTO employees VALUES ( 1, NULL )
/
UPDATE employees
SET   salary_history = COALESCE( salary_history, salary_list() )
                       MULTISET UNION ALL salary_list( 500 )
WHERE id = 1

SELECT * FROM employees
| ID | SALARY_HISTORY |
|----|----------------|
|  1 |            500 |
UPDATE employees
SET   salary_history = COALESCE( salary_history, salary_list() )
                       MULTISET UNION ALL salary_list( 700 )
WHERE id = 1

SELECT * FROM employees
| ID | SALARY_HISTORY |
|----|----------------|
|  1 |        500,700 |
UPDATE employees
SET   salary_history = COALESCE( salary_history, salary_list() )
                       MULTISET UNION ALL salary_list( 500 )
WHERE id = 1

SELECT * FROM employees
| ID | SALARY_HISTORY |
|----|----------------|
|  1 |    500,700,500 |
查询3

CREATE OR REPLACE TYPE salary_list AS TABLE OF NUMBER;
/

CREATE TABLE employees(
  id             NUMBER,
  salary_history salary_list
) NESTED TABLE salary_history STORE AS salary_history_tab
/

INSERT INTO employees VALUES ( 1, NULL )
/
UPDATE employees
SET   salary_history = COALESCE( salary_history, salary_list() )
                       MULTISET UNION ALL salary_list( 500 )
WHERE id = 1

SELECT * FROM employees
| ID | SALARY_HISTORY |
|----|----------------|
|  1 |            500 |
UPDATE employees
SET   salary_history = COALESCE( salary_history, salary_list() )
                       MULTISET UNION ALL salary_list( 700 )
WHERE id = 1

SELECT * FROM employees
| ID | SALARY_HISTORY |
|----|----------------|
|  1 |        500,700 |
UPDATE employees
SET   salary_history = COALESCE( salary_history, salary_list() )
                       MULTISET UNION ALL salary_list( 500 )
WHERE id = 1

SELECT * FROM employees
| ID | SALARY_HISTORY |
|----|----------------|
|  1 |    500,700,500 |

CREATE OR REPLACE TYPE salary_list AS TABLE OF NUMBER;
/

CREATE TABLE employees(
  id             NUMBER,
  salary_history salary_list
) NESTED TABLE salary_history STORE AS salary_history_tab
/

INSERT INTO employees VALUES ( 1, NULL )
/
UPDATE employees
SET   salary_history = COALESCE( salary_history, salary_list() )
                       MULTISET UNION ALL salary_list( 500 )
WHERE id = 1

SELECT * FROM employees
| ID | SALARY_HISTORY |
|----|----------------|
|  1 |            500 |
UPDATE employees
SET   salary_history = COALESCE( salary_history, salary_list() )
                       MULTISET UNION ALL salary_list( 700 )
WHERE id = 1

SELECT * FROM employees
| ID | SALARY_HISTORY |
|----|----------------|
|  1 |        500,700 |
UPDATE employees
SET   salary_history = COALESCE( salary_history, salary_list() )
                       MULTISET UNION ALL salary_list( 500 )
WHERE id = 1

SELECT * FROM employees
| ID | SALARY_HISTORY |
|----|----------------|
|  1 |    500,700,500 |
您可以使用
合并(salary_history,salary_list())多集联合所有salary_list(:您的新值)
将新值附加到旧列表中(如果不存在,则创建新列表)

Oracle 11g R2架构设置

CREATE OR REPLACE TYPE salary_list AS TABLE OF NUMBER;
/

CREATE TABLE employees(
  id             NUMBER,
  salary_history salary_list
) NESTED TABLE salary_history STORE AS salary_history_tab
/

INSERT INTO employees VALUES ( 1, NULL )
/
UPDATE employees
SET   salary_history = COALESCE( salary_history, salary_list() )
                       MULTISET UNION ALL salary_list( 500 )
WHERE id = 1

SELECT * FROM employees
| ID | SALARY_HISTORY |
|----|----------------|
|  1 |            500 |
UPDATE employees
SET   salary_history = COALESCE( salary_history, salary_list() )
                       MULTISET UNION ALL salary_list( 700 )
WHERE id = 1

SELECT * FROM employees
| ID | SALARY_HISTORY |
|----|----------------|
|  1 |        500,700 |
UPDATE employees
SET   salary_history = COALESCE( salary_history, salary_list() )
                       MULTISET UNION ALL salary_list( 500 )
WHERE id = 1

SELECT * FROM employees
| ID | SALARY_HISTORY |
|----|----------------|
|  1 |    500,700,500 |
查询1

CREATE OR REPLACE TYPE salary_list AS TABLE OF NUMBER;
/

CREATE TABLE employees(
  id             NUMBER,
  salary_history salary_list
) NESTED TABLE salary_history STORE AS salary_history_tab
/

INSERT INTO employees VALUES ( 1, NULL )
/
UPDATE employees
SET   salary_history = COALESCE( salary_history, salary_list() )
                       MULTISET UNION ALL salary_list( 500 )
WHERE id = 1

SELECT * FROM employees
| ID | SALARY_HISTORY |
|----|----------------|
|  1 |            500 |
UPDATE employees
SET   salary_history = COALESCE( salary_history, salary_list() )
                       MULTISET UNION ALL salary_list( 700 )
WHERE id = 1

SELECT * FROM employees
| ID | SALARY_HISTORY |
|----|----------------|
|  1 |        500,700 |
UPDATE employees
SET   salary_history = COALESCE( salary_history, salary_list() )
                       MULTISET UNION ALL salary_list( 500 )
WHERE id = 1

SELECT * FROM employees
| ID | SALARY_HISTORY |
|----|----------------|
|  1 |    500,700,500 |

CREATE OR REPLACE TYPE salary_list AS TABLE OF NUMBER;
/

CREATE TABLE employees(
  id             NUMBER,
  salary_history salary_list
) NESTED TABLE salary_history STORE AS salary_history_tab
/

INSERT INTO employees VALUES ( 1, NULL )
/
UPDATE employees
SET   salary_history = COALESCE( salary_history, salary_list() )
                       MULTISET UNION ALL salary_list( 500 )
WHERE id = 1

SELECT * FROM employees
| ID | SALARY_HISTORY |
|----|----------------|
|  1 |            500 |
UPDATE employees
SET   salary_history = COALESCE( salary_history, salary_list() )
                       MULTISET UNION ALL salary_list( 700 )
WHERE id = 1

SELECT * FROM employees
| ID | SALARY_HISTORY |
|----|----------------|
|  1 |        500,700 |
UPDATE employees
SET   salary_history = COALESCE( salary_history, salary_list() )
                       MULTISET UNION ALL salary_list( 500 )
WHERE id = 1

SELECT * FROM employees
| ID | SALARY_HISTORY |
|----|----------------|
|  1 |    500,700,500 |
查询2

CREATE OR REPLACE TYPE salary_list AS TABLE OF NUMBER;
/

CREATE TABLE employees(
  id             NUMBER,
  salary_history salary_list
) NESTED TABLE salary_history STORE AS salary_history_tab
/

INSERT INTO employees VALUES ( 1, NULL )
/
UPDATE employees
SET   salary_history = COALESCE( salary_history, salary_list() )
                       MULTISET UNION ALL salary_list( 500 )
WHERE id = 1

SELECT * FROM employees
| ID | SALARY_HISTORY |
|----|----------------|
|  1 |            500 |
UPDATE employees
SET   salary_history = COALESCE( salary_history, salary_list() )
                       MULTISET UNION ALL salary_list( 700 )
WHERE id = 1

SELECT * FROM employees
| ID | SALARY_HISTORY |
|----|----------------|
|  1 |        500,700 |
UPDATE employees
SET   salary_history = COALESCE( salary_history, salary_list() )
                       MULTISET UNION ALL salary_list( 500 )
WHERE id = 1

SELECT * FROM employees
| ID | SALARY_HISTORY |
|----|----------------|
|  1 |    500,700,500 |

CREATE OR REPLACE TYPE salary_list AS TABLE OF NUMBER;
/

CREATE TABLE employees(
  id             NUMBER,
  salary_history salary_list
) NESTED TABLE salary_history STORE AS salary_history_tab
/

INSERT INTO employees VALUES ( 1, NULL )
/
UPDATE employees
SET   salary_history = COALESCE( salary_history, salary_list() )
                       MULTISET UNION ALL salary_list( 500 )
WHERE id = 1

SELECT * FROM employees
| ID | SALARY_HISTORY |
|----|----------------|
|  1 |            500 |
UPDATE employees
SET   salary_history = COALESCE( salary_history, salary_list() )
                       MULTISET UNION ALL salary_list( 700 )
WHERE id = 1

SELECT * FROM employees
| ID | SALARY_HISTORY |
|----|----------------|
|  1 |        500,700 |
UPDATE employees
SET   salary_history = COALESCE( salary_history, salary_list() )
                       MULTISET UNION ALL salary_list( 500 )
WHERE id = 1

SELECT * FROM employees
| ID | SALARY_HISTORY |
|----|----------------|
|  1 |    500,700,500 |
查询3

CREATE OR REPLACE TYPE salary_list AS TABLE OF NUMBER;
/

CREATE TABLE employees(
  id             NUMBER,
  salary_history salary_list
) NESTED TABLE salary_history STORE AS salary_history_tab
/

INSERT INTO employees VALUES ( 1, NULL )
/
UPDATE employees
SET   salary_history = COALESCE( salary_history, salary_list() )
                       MULTISET UNION ALL salary_list( 500 )
WHERE id = 1

SELECT * FROM employees
| ID | SALARY_HISTORY |
|----|----------------|
|  1 |            500 |
UPDATE employees
SET   salary_history = COALESCE( salary_history, salary_list() )
                       MULTISET UNION ALL salary_list( 700 )
WHERE id = 1

SELECT * FROM employees
| ID | SALARY_HISTORY |
|----|----------------|
|  1 |        500,700 |
UPDATE employees
SET   salary_history = COALESCE( salary_history, salary_list() )
                       MULTISET UNION ALL salary_list( 500 )
WHERE id = 1

SELECT * FROM employees
| ID | SALARY_HISTORY |
|----|----------------|
|  1 |    500,700,500 |

CREATE OR REPLACE TYPE salary_list AS TABLE OF NUMBER;
/

CREATE TABLE employees(
  id             NUMBER,
  salary_history salary_list
) NESTED TABLE salary_history STORE AS salary_history_tab
/

INSERT INTO employees VALUES ( 1, NULL )
/
UPDATE employees
SET   salary_history = COALESCE( salary_history, salary_list() )
                       MULTISET UNION ALL salary_list( 500 )
WHERE id = 1

SELECT * FROM employees
| ID | SALARY_HISTORY |
|----|----------------|
|  1 |            500 |
UPDATE employees
SET   salary_history = COALESCE( salary_history, salary_list() )
                       MULTISET UNION ALL salary_list( 700 )
WHERE id = 1

SELECT * FROM employees
| ID | SALARY_HISTORY |
|----|----------------|
|  1 |        500,700 |
UPDATE employees
SET   salary_history = COALESCE( salary_history, salary_list() )
                       MULTISET UNION ALL salary_list( 500 )
WHERE id = 1

SELECT * FROM employees
| ID | SALARY_HISTORY |
|----|----------------|
|  1 |    500,700,500 |