Vous êtes sur la page 1sur 13

8.

 1. 9. Create view based on aggregate function

SQL>
SQL>
SQL> create table registrations
  2  ( attendee    NUMBER(4)
  3  , course      VARCHAR2(6)
  4  , begindate   DATE
  5  , evaluation  NUMBER(1)) ;

Table created.

SQL>
SQL>
SQL> insert into registrations values (1, 'SQL',date '1999-04-12',4   );

1 row created.

SQL> insert into registrations values (2, 'SQL',date '1999-12-13',NULL);

1 row created.

SQL> insert into registrations values (3, 'SQL',date '1999-12-13',NULL);

1 row created.

SQL> insert into registrations values (4, 'OAU',date '1999-08-10',4   );

1 row created.

SQL> insert into registrations values (5, 'OAU',date '2000-09-27',5   );

1 row created.

SQL> insert into registrations values (6, 'JAV',date '1999-12-13',2   );

1 row created.

SQL> insert into registrations values (7, 'JAV',date '2000-02-01',4   );

1 row created.

SQL> insert into registrations values (8, 'JAV',date '2000-02-01',5   );

1 row created.

SQL> insert into registrations values (9, 'XML',date '2000-02-03',4   );

1 row created.

SQL> insert into registrations values (10,'XML',date '2000-02-03',5   );

1 row created.

SQL> insert into registrations values (1, 'PLS',date '2000-09-11',NULL);
1 row created.

SQL> insert into registrations values (2, 'PLS',date '2000-09-11',NULL);

1 row created.

SQL> insert into registrations values (3, 'PLS',date '2000-09-11',NULL);

1 row created.

SQL>
SQL>
SQL>
SQL> create or replace view avg_evaluations as
  2  select course
  3  ,      avg(evaluation) as avg_eval
  4  from   registrations
  5  group  by course;

View created.

SQL>
SQL>
SQL> drop table registrations;

Table dropped.

SQL>
SQL>

8. 1. 5. Creating a View with a CHECK OPTION Constraint

You can specify that DML operations on a view must satisfy the subquery by adding a CHECK OPT
SQL> -- create demo table
SQL> create table Employee(
  2    ID                 VARCHAR2(4 BYTE)         NOT NULL,
  3    First_Name         VARCHAR2(10 BYTE),
  4    Last_Name          VARCHAR2(10 BYTE),
  5    Start_Date         DATE,
  6    End_Date           DATE,
  7    Salary             Number(8,2),
  8    City               VARCHAR2(10 BYTE),
  9    Description        VARCHAR2(15 BYTE)
 10  )
 11  /

Table created.

SQL>
SQL> -- prepare data
SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     E
  2               values ('01','Jason',    'Martin',  to_date('19960725','YYYYMMDD'), t
  3  /

1 row created.

SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     E
  2                values('02','Alison',   'Mathews', to_date('19760321','YYYYMMDD'), t
  3  /

1 row created.

SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     E
  2                values('03','James',    'Smith',   to_date('19781212','YYYYMMDD'), t
  3  /

1 row created.

SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     E
  2                values('04','Celia',    'Rice',    to_date('19821024','YYYYMMDD'), t
  3  /

1 row created.

SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     E
  2                values('05','Robert',   'Black',   to_date('19840115','YYYYMMDD'), t
  3  /

1 row created.

SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     E
  2                values('06','Linda',    'Green',   to_date('19870730','YYYYMMDD'), t
  3  /

1 row created.

SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     E
  2                values('07','David',    'Larry',   to_date('19901231','YYYYMMDD'), t
  3  /

1 row created.

SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     E
  2                values('08','James',    'Cat',     to_date('19960917','YYYYMMDD'), t
  3  /

1 row created.

SQL>
SQL>
SQL>
SQL> -- display data in the table
SQL> select * from Employee
  2  /

ID   FIRST_NAME LAST_NAME  START_DAT END_DATE      SALARY CITY       DESCRIPTION
---- ---------- ---------- --------- --------- ---------- ---------- ---------------
01   Jason      Martin     25-JUL-96 25-JUL-06    1234.56 Toronto    Programmer
02   Alison     Mathews    21-MAR-76 21-FEB-86    6661.78 Vancouver  Tester
03   James      Smith      12-DEC-78 15-MAR-90    6544.78 Vancouver  Tester
04   Celia      Rice       24-OCT-82 21-APR-99    2344.78 Vancouver  Manager
05   Robert     Black      15-JAN-84 08-AUG-98    2334.78 Vancouver  Tester
06   Linda      Green      30-JUL-87 04-JAN-96    4322.78 New York   Tester
07   David      Larry      31-DEC-90 12-FEB-98    7897.78 New York   Manager
08   James      Cat        17-SEP-96 15-APR-02    1232.78 Vancouver  Tester

8 rows selected.

SQL>
SQL> CREATE VIEW myView AS
  2  SELECT *
  3  FROM employee
  4  WHERE id < 5
  5  WITH CHECK OPTION CONSTRAINT myView;

View created.

SQL>
SQL> INSERT INTO myView (id) VALUES (0);

1 row created.

SQL>
SQL> INSERT INTO myView (id) VALUES (7);
INSERT INTO myView (id) VALUES (7)
            *
ERROR at line 1:
ORA-01402: view WITH CHECK OPTION where-clause violation

SQL>
SQL> select * from myView;

ID   FIRST_NAME LAST_NAME  START_DAT END_DATE      SALARY CITY       DESCRIPTION
---- ---------- ---------- --------- --------- ---------- ---------- ---------------
01   Jason      Martin     25-JUL-96 25-JUL-06    1234.56 Toronto    Programmer
02   Alison     Mathews    21-MAR-76 21-FEB-86    6661.78 Vancouver  Tester
03   James      Smith      12-DEC-78 15-MAR-90    6544.78 Vancouver  Tester
04   Celia      Rice       24-OCT-82 21-APR-99    2344.78 Vancouver  Manager
0

SQL>
SQL> drop view myView;

View dropped.

SQL>
SQL>
SQL>
SQL> -- clean the table
SQL> drop table Employee
  2  /

Table dropped.
SQL>
SQL>
SQL>

8. 1. 6. Creating a View with a READ ONLY Constraint

You can make a view read only by adding a READ ONLY constraint to the view.
SQL> -- create demo table
SQL> create table Employee(
  2    ID                 VARCHAR2(4 BYTE)         NOT NULL,
  3    First_Name         VARCHAR2(10 BYTE),
  4    Last_Name          VARCHAR2(10 BYTE),
  5    Start_Date         DATE,
  6    End_Date           DATE,
  7    Salary             Number(8,2),
  8    City               VARCHAR2(10 BYTE),
  9    Description        VARCHAR2(15 BYTE)
 10  )
 11  /

Table created.

SQL>
SQL> -- prepare data
SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     E
  2               values ('01','Jason',    'Martin',  to_date('19960725','YYYYMMDD'), t
  3  /

1 row created.

SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     E
  2                values('02','Alison',   'Mathews', to_date('19760321','YYYYMMDD'), t
  3  /

1 row created.

SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     E
  2                values('03','James',    'Smith',   to_date('19781212','YYYYMMDD'), t
  3  /

1 row created.

SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     E
  2                values('04','Celia',    'Rice',    to_date('19821024','YYYYMMDD'), t
  3  /

1 row created.

SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     E
  2                values('05','Robert',   'Black',   to_date('19840115','YYYYMMDD'), t
  3  /
1 row created.

SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     E
  2                values('06','Linda',    'Green',   to_date('19870730','YYYYMMDD'), t
  3  /

1 row created.

SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     E
  2                values('07','David',    'Larry',   to_date('19901231','YYYYMMDD'), t
  3  /

1 row created.

SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     E
  2                values('08','James',    'Cat',     to_date('19960917','YYYYMMDD'), t
  3  /

1 row created.

SQL>
SQL>
SQL>
SQL> -- display data in the table
SQL> select * from Employee
  2  /

ID   FIRST_NAME LAST_NAME  START_DAT END_DATE      SALARY CITY       DESCRIPTION
---- ---------- ---------- --------- --------- ---------- ---------- ---------------
01   Jason      Martin     25-JUL-96 25-JUL-06    1234.56 Toronto    Programmer
02   Alison     Mathews    21-MAR-76 21-FEB-86    6661.78 Vancouver  Tester
03   James      Smith      12-DEC-78 15-MAR-90    6544.78 Vancouver  Tester
04   Celia      Rice       24-OCT-82 21-APR-99    2344.78 Vancouver  Manager
05   Robert     Black      15-JAN-84 08-AUG-98    2334.78 Vancouver  Tester
06   Linda      Green      30-JUL-87 04-JAN-96    4322.78 New York   Tester
07   David      Larry      31-DEC-90 12-FEB-98    7897.78 New York   Manager
08   James      Cat        17-SEP-96 15-APR-02    1232.78 Vancouver  Tester

8 rows selected.

SQL>
SQL>
SQL> CREATE VIEW myView AS
  2  SELECT *
  3  FROM employee
  4  WITH READ ONLY CONSTRAINT my_view_read_only;

View created.

SQL>
SQL> INSERT INTO myView (id) VALUES (1);
INSERT INTO myView (id) VALUES (1)
                    *
ERROR at line 1:
ORA-01733: virtual column not allowed here
SQL>
SQL> drop view myView;

View dropped.

SQL> -- clean the table
SQL> drop table Employee
  2  /

Table dropped.

SQL>
SQL>

8. 1. 6. Creating a View with a READ ONLY Constraint

You can make a view read only by adding a READ ONLY constraint to the view.
SQL> -- create demo table
SQL> create table Employee(
  2    ID                 VARCHAR2(4 BYTE)         NOT NULL,
  3    First_Name         VARCHAR2(10 BYTE),
  4    Last_Name          VARCHAR2(10 BYTE),
  5    Start_Date         DATE,
  6    End_Date           DATE,
  7    Salary             Number(8,2),
  8    City               VARCHAR2(10 BYTE),
  9    Description        VARCHAR2(15 BYTE)
 10  )
 11  /

Table created.

SQL>
SQL> -- prepare data
SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     E
  2               values ('01','Jason',    'Martin',  to_date('19960725','YYYYMMDD'), t
  3  /

1 row created.

SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     E
  2                values('02','Alison',   'Mathews', to_date('19760321','YYYYMMDD'), t
  3  /

1 row created.

SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     E
  2                values('03','James',    'Smith',   to_date('19781212','YYYYMMDD'), t
  3  /

1 row created.
SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     E
  2                values('04','Celia',    'Rice',    to_date('19821024','YYYYMMDD'), t
  3  /

1 row created.

SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     E
  2                values('05','Robert',   'Black',   to_date('19840115','YYYYMMDD'), t
  3  /

1 row created.

SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     E
  2                values('06','Linda',    'Green',   to_date('19870730','YYYYMMDD'), t
  3  /

1 row created.

SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     E
  2                values('07','David',    'Larry',   to_date('19901231','YYYYMMDD'), t
  3  /

1 row created.

SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     E
  2                values('08','James',    'Cat',     to_date('19960917','YYYYMMDD'), t
  3  /

1 row created.

SQL>
SQL>
SQL>
SQL> -- display data in the table
SQL> select * from Employee
  2  /

ID   FIRST_NAME LAST_NAME  START_DAT END_DATE      SALARY CITY       DESCRIPTION
---- ---------- ---------- --------- --------- ---------- ---------- ---------------
01   Jason      Martin     25-JUL-96 25-JUL-06    1234.56 Toronto    Programmer
02   Alison     Mathews    21-MAR-76 21-FEB-86    6661.78 Vancouver  Tester
03   James      Smith      12-DEC-78 15-MAR-90    6544.78 Vancouver  Tester
04   Celia      Rice       24-OCT-82 21-APR-99    2344.78 Vancouver  Manager
05   Robert     Black      15-JAN-84 08-AUG-98    2334.78 Vancouver  Tester
06   Linda      Green      30-JUL-87 04-JAN-96    4322.78 New York   Tester
07   David      Larry      31-DEC-90 12-FEB-98    7897.78 New York   Manager
08   James      Cat        17-SEP-96 15-APR-02    1232.78 Vancouver  Tester

8 rows selected.

SQL>
SQL>
SQL> CREATE VIEW myView AS
  2  SELECT *
  3  FROM employee
  4  WITH READ ONLY CONSTRAINT my_view_read_only;

View created.

SQL>
SQL> INSERT INTO myView (id) VALUES (1);
INSERT INTO myView (id) VALUES (1)
                    *
ERROR at line 1:
ORA-01733: virtual column not allowed here

SQL>
SQL> drop view myView;

View dropped.

SQL> -- clean the table
SQL> drop table Employee
  2  /

Table dropped.

SQL>
SQL>

8. 1. 10. a user-defined type view

SQL>
SQL>
SQL>
SQL> CREATE TABLE EMP (EMPNO NUMBER(4) NOT NULL,
  2                    ENAME VARCHAR2(10),
  3                    JOB VARCHAR2(9),
  4                    MGR NUMBER(4),
  5                    HIREDATE DATE,
  6                    SAL NUMBER(7, 2),
  7                    COMM NUMBER(7, 2),
  8                    DEPTNO NUMBER(2));

Table created.

SQL>
SQL>
SQL> INSERT INTO EMP VALUES (7369, 'SMITH', 'CLERK',    7902, TO_DATE('17-DEC-1980', 'D

1 row created.

SQL> INSERT INTO EMP VALUES (7499, 'ALLEN', 'SALESMAN', 7698, TO_DATE('20-FEB-1981', 'D

1 row created.

SQL> INSERT INTO EMP VALUES (7521, 'WARD',  'SALESMAN', 7698, TO_DATE('22-FEB-1981', 'D
1 row created.

SQL> INSERT INTO EMP VALUES (7566, 'JONES', 'MANAGER',  7839, TO_DATE('2-APR-1981',  'D

1 row created.

SQL> INSERT INTO EMP VALUES (7654, 'MARTIN', 'SALESMAN', 7698,TO_DATE('28-SEP-1981', 'D

1 row created.

SQL> INSERT INTO EMP VALUES (7698, 'BLAKE', 'MANAGER', 7839,TO_DATE('1-MAY-1981', 'DD-M

1 row created.

SQL> INSERT INTO EMP VALUES (7782, 'CLARK', 'MANAGER', 7839,TO_DATE('9-JUN-1981', 'DD-M

1 row created.

SQL> INSERT INTO EMP VALUES (7788, 'SCOTT', 'ANALYST', 7566,TO_DATE('09-DEC-1982', 'DD-

1 row created.

SQL> INSERT INTO EMP VALUES (7839, 'KING', 'PRESIDENT', NULL,TO_DATE('17-NOV-1981', 'DD

1 row created.

SQL> INSERT INTO EMP VALUES (7844, 'TURNER', 'SALESMAN', 7698,TO_DATE('8-SEP-1981', 'DD

1 row created.

SQL> INSERT INTO EMP VALUES (7876, 'ADAMS', 'CLERK', 7788,TO_DATE('12-JAN-1983', 'DD-MO

1 row created.

SQL> INSERT INTO EMP VALUES (7900, 'JAMES', 'CLERK', 7698,TO_DATE('3-DEC-1981', 'DD-MON

1 row created.

SQL> INSERT INTO EMP VALUES (7902, 'FORD', 'ANALYST', 7566,TO_DATE('3-DEC-1981', 'DD-MO

1 row created.

SQL> INSERT INTO EMP VALUES (7934, 'MILLER', 'CLERK', 7782,TO_DATE('23-JAN-1982', 'DD-M

1 row created.

SQL>
SQL>
SQL>
SQL>
SQL> CREATE TABLE DEPT (DEPTNO NUMBER(2),DNAME VARCHAR2(14),LOC VARCHAR2(13) );

Table created.

SQL>
SQL> INSERT INTO DEPT VALUES (10, 'ACCOUNTING', 'NEW YORK');

1 row created.

SQL> INSERT INTO DEPT VALUES (20, 'RESEARCH', 'DALLAS');

1 row created.

SQL> INSERT INTO DEPT VALUES (30, 'SALES', 'CHICAGO');

1 row created.

SQL> INSERT INTO DEPT VALUES (40, 'OPERATIONS', 'BOSTON');

1 row created.

SQL>
SQL> create or replace type emp_type
  2  as object
  3  (empno       number(4),
  4   ename       varchar2(10),
  5   job         varchar2(9),
  6   mgr         number(4),
  7   hiredate    date,
  8   sal         number(7, 2),
  9   comm        number(7, 2)
 10  );
 11  /

Type created.

SQL>
SQL>
SQL> create or replace type emp_tab_type
  2  as table of emp_type
  3  /

Type created.

SQL>
SQL>
SQL> create or replace type dept_type
  2  as object
  3  ( deptno number(2),
  4    dname  varchar2(14),
  5    loc    varchar2(13),
  6    emps   emp_tab_type
  7  )
  8  /

Type created.

SQL>
SQL> create or replace view dept_or
  2  of dept_type
  3  with object identifier(deptno)
  4  as
  5  select deptno, dname, loc,
  6         cast ( multiset (
  7                 select empno, ename, job, mgr, hiredate, sal, comm
  8                   from emp
  9                  where emp.deptno = dept.deptno )
 10                as emp_tab_type )
 11    from dept
 12  /

View created.

SQL>
SQL> declare
  2     l_emps  emp_tab_type;
  3  begin
  4      select p.emps into l_emps from dept_or p where deptno = 10;
  5
  6      for i in 1 .. l_emps.count
  7      loop
  8          l_emps(i).ename := lower(l_emps(i).ename);
  9      end loop;
 10
 11      update dept_or set emps = l_emps where deptno = 10;
 12  end;
 13  /
declare
*
ERROR at line 1:
ORA-01733: virtual column not allowed here
ORA-06512: at line 11

SQL>
SQL> drop type dept_type;

Type dropped.

SQL>
SQL> drop type emp_tab_type;

Type dropped.

SQL>
SQL> drop type emp_type;

Type dropped.

SQL>
SQL> drop table emp;

Table dropped.

SQL>
SQL> drop table dept;
Table dropped.

Vous aimerez peut-être aussi