向视图中插入数据的问题(通过触发器向视图插入数据)
2010-04-24 10:53
267 查看
两个表:
CREATE TABLE SCOTT.DTEMP (
VNAME VARCHAR2(20) NOT NULL PRIMARY KEY,
VID VARCHAR2(20) NOT NULL
)
CREATE TABLE SCOTT.DTEMPME (
VNAME VARCHAR2(20) NOT NULL PRIMARY KEY,
VSS VARCHAR2(20) NOT NULL
)
在这个基础上建立的视图:
CREATE VIEW SCOTT.BBVIEW AS
select dtemp.vname as pvname, dtemp.vid, dtempMe.* from dtemp,dtempMe
插入数据出现问题:
insert into bbview (pvname, vname, vid, vss) values ('101','102','102','101')
*
ERROR 位于第 1 行:
ORA-01779: 无法修改与非键值保存表对应的列
-----------------------------------------------------------------------------------------------------------------------------------
假定两个表用vname字段连接:
CREATE VIEW SCOTT.BBVIEW AS
select dtemp.vname as pvname, dtemp.vid, dtempMe.*
from dtemp,dtempMe
where dtemp.vname = dtempme.vname;
--对view,每次只能向一个基表中插入数据
--在表dtemp中插入一行
insert into bbview (pvname, vid)
values ('101','102');
--在表dtempme中插入一行,vname相同
insert into bbview (vname, vss)
values ('101','102');
-----------------------------------------------------------------------------------------------------------------------------------
我找了一下资料,不知对你有没有启发:
(通过触发器的INSTEAD OF来修改视图)
CREATE TABLE customers_sj
(
cust NUMBER(6),
address VARCHAR2(50),
credit NUMBER(9,2)
);
CREATE TABLE customers_pa
(
cust NUMBER(6),
address VARCHAR2(50),
credit NUMBER(9,2)
);
CREATE TYPE customer_t AS OBJECT
(
cust NUMBER(6),
address VARCHAR2(50),
credit NUMBER(9,2),
location VARCHAR2(20)
);
CREATE VIEW all_customers (cust)
AS SELECT customer_t (cust, address, credit, ’SAN_JOSE’)
FROM customers_sj
UNION ALL
SELECT customer_t (cust, address, credit, ’PALO_ALTO’)
FROM customers_pa;
CREATE TRIGGER instrig INSTEAD OF INSERT ON all_customers
FOR EACH ROW
BEGIN
IF (:new.cust.location = ’SAN_JOSE’) THEN
INSERT INTO customers_sj
VALUES (:new.cust.cust, :new.cust.address,:new.cust.credit);
ELSE
INSERT INTO customers_pa
VALUES (:new.cust.cust, :new.cust.address, :new.cust.credit);
END IF;
END;
-----------------------------------------------------------------------------------------------------------------------------------
还是被我弄出来了:
SQL> CREATE TABLE DTEMP (
2 VNAME VARCHAR2(20) NOT NULL PRIMARY KEY,
3 VID VARCHAR2(20) NOT NULL
4 )
5 ;
表已创建。
SQL> CREATE TABLE DTEMPME (
2 VNAME VARCHAR2(20) NOT NULL PRIMARY KEY,
3 VSS VARCHAR2(20) NOT NULL
4 );
表已创建。
SQL> CREATE VIEW BBVIEW AS
2 select dtemp.vname as pvname, dtemp.vid, dtempMe.* from dtemp,dtempMe where dtemp.vname=dtemp
me.vname;
视图已建立。
----------
建一个TRIGGER:
create or replace trigger BBTrigger
instead of insert on bbview
for each row
declare
-- local variables here
begin
insert into sa.dtemp values(:new.pvname,:new.vid);
insert into sa.DTEMPME values(:new.vname,:new.VSS);
end BBTrigger;
------------
SQL> insert into bbview (pvname, vname, vid, vss) values ('101','102','102','101');
已创建 1 行。
SQL> select *From dtemp;
VNAME VID
-------------------- --------------------
101 102
SQL> select *From DTEMPME;
VNAME VSS
-------------------- --------------------
102 101
SQL>
-------------------------------------------------------
OK!
CREATE TABLE SCOTT.DTEMP (
VNAME VARCHAR2(20) NOT NULL PRIMARY KEY,
VID VARCHAR2(20) NOT NULL
)
CREATE TABLE SCOTT.DTEMPME (
VNAME VARCHAR2(20) NOT NULL PRIMARY KEY,
VSS VARCHAR2(20) NOT NULL
)
在这个基础上建立的视图:
CREATE VIEW SCOTT.BBVIEW AS
select dtemp.vname as pvname, dtemp.vid, dtempMe.* from dtemp,dtempMe
插入数据出现问题:
insert into bbview (pvname, vname, vid, vss) values ('101','102','102','101')
*
ERROR 位于第 1 行:
ORA-01779: 无法修改与非键值保存表对应的列
-----------------------------------------------------------------------------------------------------------------------------------
假定两个表用vname字段连接:
CREATE VIEW SCOTT.BBVIEW AS
select dtemp.vname as pvname, dtemp.vid, dtempMe.*
from dtemp,dtempMe
where dtemp.vname = dtempme.vname;
--对view,每次只能向一个基表中插入数据
--在表dtemp中插入一行
insert into bbview (pvname, vid)
values ('101','102');
--在表dtempme中插入一行,vname相同
insert into bbview (vname, vss)
values ('101','102');
-----------------------------------------------------------------------------------------------------------------------------------
我找了一下资料,不知对你有没有启发:
(通过触发器的INSTEAD OF来修改视图)
CREATE TABLE customers_sj
(
cust NUMBER(6),
address VARCHAR2(50),
credit NUMBER(9,2)
);
CREATE TABLE customers_pa
(
cust NUMBER(6),
address VARCHAR2(50),
credit NUMBER(9,2)
);
CREATE TYPE customer_t AS OBJECT
(
cust NUMBER(6),
address VARCHAR2(50),
credit NUMBER(9,2),
location VARCHAR2(20)
);
CREATE VIEW all_customers (cust)
AS SELECT customer_t (cust, address, credit, ’SAN_JOSE’)
FROM customers_sj
UNION ALL
SELECT customer_t (cust, address, credit, ’PALO_ALTO’)
FROM customers_pa;
CREATE TRIGGER instrig INSTEAD OF INSERT ON all_customers
FOR EACH ROW
BEGIN
IF (:new.cust.location = ’SAN_JOSE’) THEN
INSERT INTO customers_sj
VALUES (:new.cust.cust, :new.cust.address,:new.cust.credit);
ELSE
INSERT INTO customers_pa
VALUES (:new.cust.cust, :new.cust.address, :new.cust.credit);
END IF;
END;
-----------------------------------------------------------------------------------------------------------------------------------
还是被我弄出来了:
SQL> CREATE TABLE DTEMP (
2 VNAME VARCHAR2(20) NOT NULL PRIMARY KEY,
3 VID VARCHAR2(20) NOT NULL
4 )
5 ;
表已创建。
SQL> CREATE TABLE DTEMPME (
2 VNAME VARCHAR2(20) NOT NULL PRIMARY KEY,
3 VSS VARCHAR2(20) NOT NULL
4 );
表已创建。
SQL> CREATE VIEW BBVIEW AS
2 select dtemp.vname as pvname, dtemp.vid, dtempMe.* from dtemp,dtempMe where dtemp.vname=dtemp
me.vname;
视图已建立。
----------
建一个TRIGGER:
create or replace trigger BBTrigger
instead of insert on bbview
for each row
declare
-- local variables here
begin
insert into sa.dtemp values(:new.pvname,:new.vid);
insert into sa.DTEMPME values(:new.vname,:new.VSS);
end BBTrigger;
------------
SQL> insert into bbview (pvname, vname, vid, vss) values ('101','102','102','101');
已创建 1 行。
SQL> select *From dtemp;
VNAME VID
-------------------- --------------------
101 102
SQL> select *From DTEMPME;
VNAME VSS
-------------------- --------------------
102 101
SQL>
-------------------------------------------------------
OK!
相关文章推荐
- 通过触发器实现两张有主外键关系的表的数据插入问题
- 通过触发器实现两张有主外键关系的表的数据插入问题
- Oracle中通过存储过程,Function,触发器实现解析时间类型的字段并插入的对应的数据表中
- 解决 通过JDBC向MySQL插入数据的中文乱码 问题
- TRIGGERS_监测系统_多表视图触发器—向原始数据报表中插入数据
- 通过Link server 插入数据时产生的问题
- 通过jsp页面向mysql数据库插入中文数据时乱码问题
- oracle插入数据时提示视图或表不存在问题
- mysql 通过程序插入数据乱码问题
- 在论坛中出现的比较难的sql问题:9(触发器专题 插入数据自动更新表数据)
- 在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据)
- C#通过PHP向MySQL插入数据的编码问题
- hive——通过外部向表中插入数据问题
- 解决通过identity字段关联的多个数据表插入问题
- Jquery 动态生成表单 并将表单数据 批量通过Ajax插入到数据库
- Mysql数据库插入数据乱码问题,解决方案!
- 在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题。该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度。
- SQL 通过视图更新数据
- 解决sqlite3插入数据很慢的问题
- 关于Map数据插入读取的问题