Directorio de artículos
1. Información general
-- 查询所有 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
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:
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:
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:
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: