Oracle 创建嵌套表并仅在内部表中插入数据
我有一个表:employees(id、firstname、lastname、salary),我添加了另一个列来存储每个员工过去的所有工资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
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 |