Vista detallada de Oracle (ver)

1. Información general

Inserte la descripción de la imagen aquí

-- 查询所有 view
SELECT * FROM dba_views t; -- all_views, user_views

-- 删除视图 
DROP VIEW 视图名;

2 gramática

CREATE [OR REPLACE] [FORCE] VIEW [属主.]<view_name>
AS  (
  SELECT 语句
)
[WITH CHECK OPTION]
[WITH READ ONLY];

Explicación de palabras clave:

1. or replace: 存在就替换原视图
2. force: 强制执行,即使报错。常用来处理执行顺序导致的问题
3. with check option: 插入或修改的数据行必须满足视图定义的约束
4. with read only: 该执行上不能进行任何 dml 操作

Datos básicos:

CREATE TABLE stu_info (
  id   number(3) not null,
  name varchar2(30) not null,
  sex  varchar2(2) not null
);

INSERT INTO stu_info (id, NAME, sex) VALUES (1, '瑶瑶', '女');

3 ejemplo

3.1 forzar fuerza para crear una vista

Los escenarios de aplicación reales: cuando el despliegue de DB, el orden es: DDL 语句 -> DML 语句 -> PKG,
si la declaración DDL llama vista PKG, se producirá un error al desplegar (debido a que el paquete no ha sido desplegado), pero este error desaparecerá después del despliegue PKG, esta vez Se usa la fuerza.

Crear declaración de vista:

CREATE OR REPLACE VIEW vw_stu_info AS (
 SELECT si.id,
        si.name,
        si.sex,
        f_get_class_no(si.id) class_no -- pkg 中,还未被执行(简单演示,就没写到 pkg 里面,但效果是一样的)
   FROM stu_info SI
);
/

Resultado de la ejecución: después de
Inserte la descripción de la imagen aquí
agregar fuerza, la ejecución es exitosa

CREATE OR REPLACE FORCE VIEW vw_stu_info AS (
 SELECT si.id,
        si.name,
        si.sex,
        f_get_class_no(si.id) class_no -- 假如有这个方法
   FROM stu_info SI
);
/
  • Sugerencias: La vista en este momento no es válida, solo es válida después de que se ejecute la función f_get_class_no.
SELECT t.status, t.* FROM all_objects t WHERE t.OBJECT_NAME = UPPER('vw_stu_info');
-- INVALID: 无效

Implemente los métodos en pkg en orden: f_get_class_no (en el desarrollo real, la función se coloca en pkg, aquí solo se usa como prueba)

CREATE OR REPLACE FUNCTION f_get_class_no(v_id stu_info.id%TYPE)
   RETURN VARCHAR2 AS
   v_class_no VARCHAR2(10);
BEGIN
   IF v_id < 5 THEN
      v_class_no := 'A001';
   ELSIF v_id >= 5 THEN
      v_class_no := 'A002';
   ELSE
      v_class_no := 'A000';
   END IF;
   
   RETURN v_class_no;
END;
/

Vista de consulta:

SELECT * FROM vw_stu_info;

resultado de búsqueda:
Inserte la descripción de la imagen aquí

3.2 operación dml

En circunstancias normales, solo realizaremos operaciones de consulta en vistas, pero debemos comprender que las vistas también pueden realizar inserción, actualización y eliminación, pero existen muchas restricciones.

  • Cumplimiento: "vista simple" -> la vista contiene solo una tabla base, no hay otras verificaciones de restricciones

Crear declaración de vista:

CREATE OR REPLACE VIEW vw_stu_info AS 
SELECT si.id,
       si.name,
       si.sex
  FROM stu_info SI;
/

Declaración de prueba: ( 可以理解为向 基表 中插入数据的情况)

-- TRUNCATE TABLE stu_info; 清除历史数据,如果有

INSERT INTO vw_stu_info (id, NAME, sex) VALUES (1, '瑶瑶', '女');

SELECT * FROM vw_stu_info;

Resultados de la prueba:
Inserte la descripción de la imagen aquí

Comprensión personal:

  • Base del 向视图中插入数据情况,可以转化为向基表中插入数据的情况,然后再考虑 dml 操作的可行性juicio:.
  • En circunstancias normales, solo consultaremos la vista y no haremos la operación dml, así que entiéndalo aquí.
  • Existen aproximadamente las siguientes situaciones (tal vez haya visto otras situaciones mencionadas por otros, ¡pero todo debe basarse en casos reales de sus propias manos!)
Disconformidad comprensión
Conexión de mesa base múltiple Provisiones (extensión: la operación dml se puede realizar en lugar del disparador)
Existe una columna virtual No en la tabla base, calculada por expresiones, rowid, rownum, etc.
Hay una columna no nula que no está en la vista. Se entiende bien, si no, viola la restricción de no vacío de la tabla base

3.3 con opción de verificación

  • Verifique las opciones: al realizar operaciones dml en la vista, debe cumplir con las restricciones de dónde

Comprensión personal:

1. 对于 insert,有 with check option 时,要保证 insert 后,数据能被视图查询出来(符合 where 条件) 
2. 对于 update,有 with check option 时,要保证 update 后,数据能被视图查询出来(符合 where 条件)
3. 对于 delete,有无 with check option 都一样
4. 对于没有 where 子句的视图,使用 with check option 是多余的 

Datos básicos:

TRUNCATE TABLE stu_info; -- 清除历史数据

INSERT INTO stu_info (id, NAME, sex) VALUES (1, '瑶瑶', '女');
INSERT INTO stu_info (id, NAME, sex) VALUES (2, '倩倩', '女');
INSERT INTO stu_info (id, NAME, sex) VALUES (3, '优优', '男');
COMMIT;

Ver código:

CREATE OR REPLACE VIEW vw_stu_info AS (
 SELECT si.id,
        si.name,
        si.sex
   FROM stu_info SI
  WHERE si.id <= 5
) WITH CHECK OPTION;
/

Declaración de prueba:

-- id = 6 > 5, 不符合视图中的 where 条件
INSERT INTO vw_stu_info (id, NAME, sex) VALUES (6, '测试66', '男');

Resultados de la prueba:
Inserte la descripción de la imagen aquí

3.4 con solo lectura

  • Verifique las opciones: vista de solo lectura, la operación dml está prohibida

Crear declaración de vista:

CREATE OR REPLACE VIEW vw_stu_info AS (
 SELECT si.id,
        si.name,
        si.sex
   FROM stu_info SI
  WHERE si.id <= 5
) WITH READ ONLY;
/

Declaración de prueba:

INSERT INTO vw_stu_info (id, NAME, sex) VALUES (6, '测试66', '男');

Resultados de la prueba:
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_34745941/article/details/106399534
Recomendado
Clasificación