Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Oracle中使用CREATE VIEW object插入数据,并使用INSTEAD而不是触发器创建多个表?_Oracle - Fatal编程技术网

如何在Oracle中使用CREATE VIEW object插入数据,并使用INSTEAD而不是触发器创建多个表?

如何在Oracle中使用CREATE VIEW object插入数据,并使用INSTEAD而不是触发器创建多个表?,oracle,Oracle,根据stackoverflow用户的反馈,我研究了docs.oracle.com,而不是Tirgers,但我仍然无法正确理解这一点。视图创建得很好,但是INSTEAD OF触发器没有。此外,我不知道如何为多个输入设置“n”。在我执行代码之后,没有任何错误的迹象,或者它是否工作。我松开了SQL>提示符,无法执行任何操作,最后不得不重新启动环境 以下是我根据Oracle的示例得出的结论: SQL> CREATE OR REPLACE VIEW cust_order AS 2 SELEC

根据stackoverflow用户的反馈,我研究了docs.oracle.com,而不是Tirgers,但我仍然无法正确理解这一点。视图创建得很好,但是INSTEAD OF触发器没有。此外,我不知道如何为多个输入设置“n”。在我执行代码之后,没有任何错误的迹象,或者它是否工作。我松开了SQL>提示符,无法执行任何操作,最后不得不重新启动环境

以下是我根据Oracle的示例得出的结论:

SQL> CREATE OR REPLACE VIEW cust_order AS
  2   SELECT book_customer.customerid, lastname, state, book_order.orderid, orderdate
  3    FROM book_customer
  4      JOIN book_order ON book_order.customerid = book_customer.customerid
  5  ;

View created.

SQL> 
SQL>
SQL> CREATE OR REPLACE TRIGGER cust_order_insert
  2   INSTEAD OF INSERT ON cust_order
  3    REFERENCING NEW AS n
  4     FOR EACH ROW
  5  
  6  DECLARE
  7   rowcnt number;
  8  
  9  BEGIN
 10   SELECT COUNT(*) INTO rowcnt
 11    FROM book_customer
 12     WHERE book_customer.customerid = :n.book_customer.customerid;
 13      IF rowcnt = 0 THEN
 14       INSERT INTO book_customer(customerid, lastname, state)
 15        VALUES (:n.book_customer.customerid, :n.lastname, :n.state);
 16         ELSE
 17         UPDATE book_customer SET book_customer.customerid = :n.customerid
 18          WHERE book_customer.customerid = :n.customerid;
 19       END IF;
 20       
 21   SELECT COUNT(*) INTO rowcnt
 22    FROM book_order
 23     WHERE book_order.orderid = :n.orderid;
 24      IF rowcnt = 0 THEN
 25       INSERT INTO book_order(orderid, orderdate)
 26        VALUES (:n.book_order.orderid, :n.orderdate);
 27         ELSE
 28         UPDATE book_order SET book_order.orderid = :n.orderid
 29          WHERE book_order.orderdate = :n.orderdate;
 30       END IF;
 31  END;
 32  
 33  
 34  
 35  
 36  --SQL> prompt won't come back.
 37  
 38  
 39  
 40  
以下是表格说明:

SQL> desc cust_order;
 Name                                                              Null?    Type
 ----------------------------------------------------------------- -------- ------------------------
 CUSTOMERID                                                        NOT NULL NUMBER(4)
 LASTNAME                                                                   VARCHAR2(10)
 STATE                                                                      VARCHAR2(2)
 ORDERID                                                           NOT NULL NUMBER(4)
 ORDERDATE                                                                  DATE
定义:

Create table Book_customer
(CustomerID  NUMBER(4) CONSTRAINT PK_BOOKCUSTOMER PRIMARY KEY,
LastName VARCHAR2(10),
FirstName VARCHAR2(10),
Address VARCHAR2(20),
City VARCHAR2(20),
State VARCHAR2(2),
Zip VARCHAR2(5),
Referred NUMBER(4));

Create Table Book_order
(OrderID NUMBER(4) CONSTRAINT PK_BOOKORDER_ORDERID PRIMARY KEY,
CustomerID NUMBER(4) CONSTRAINT FK_BookOrder_BookCustomer REFERENCES Book_Customer (CustomerID),
OrderDate DATE,
ShipDate DATE,
ShipStreet VARCHAR2(20),
ShipCity VARCHAR2(20),
ShipState VARCHAR2(2),
ShipZip VARCHAR2(5));

任何想法或建设性的批评都将受到赞赏

我不会依赖第三方书籍,因为它都在Oracle文档中描述过:而且


密切关注关键保留表的含义。在您的情况下,假设Book_Customer.Customer是主键/唯一键,您应该能够插入Book_Customer,但不能插入Cust_Order,我猜您没有正确结束PL/SQL块。只需在末尾使用“/”。您还可以在同一IF-ELSE块下的两个表中包含DML

SQL> CREATE OR REPLACE TRIGGER cust_order_insert
  2   INSTEAD OF INSERT ON cust_order
  3    REFERENCING NEW AS n
  4     FOR EACH ROW
  5  
  6  DECLARE
  7   rowcnt number;
  8  
  9  BEGIN
 10   SELECT COUNT(*) INTO rowcnt
 11    FROM book_customer
 12     WHERE book_customer.customerid = :n.book_customer.customerid;
 13      IF rowcnt = 0 THEN
 14       INSERT INTO book_customer(customerid, lastname, state)
 15        VALUES (:n.book_customer.customerid, :n.lastname, :n.state);
 16       INSERT INTO book_order(orderid, orderdate)
 17        VALUES (:n.book_order.orderid, :n.orderdate);
 18         ELSE
 19         UPDATE book_customer SET book_customer.customerid = :n.customerid
 20          WHERE book_customer.customerid = :n.customerid;
 21         UPDATE book_order SET book_order.orderid = :n.orderid
 22          WHERE book_order.orderdate = :n.orderdate;
 23       END IF;
 24  END;
 25 /

我认为你做不到。你能发布两个基表的定义吗?这是家庭作业吗?在视图上创建
而不是
触发器是否是一个选项?表定义还应包括主键、外键和唯一约束。否则,我们不知道视图是否可以被保留。理想情况下,您应该发布DDL来创建表,以便我们可以在系统上创建它们来测试答案。
代替
触发器是选项吗?视图上的
代替
触发器是选项吗?是的,可以使用代替触发器。我根据Andrew留下的链接进行了研究,但我仍然无法让它工作。不幸的是,我没有数据字典,但我发布了与数据字典信息相同的.sql文件。有什么想法吗?谢谢你的反馈。你好,安德鲁,我研究了替代触发器,但多次尝试后都无法使其工作。有什么想法吗?