人大金仓 金仓数据库KingbaseES PLSQL对象状态介绍

133 阅读5分钟

金仓数据库KingbaseES PLSQL对象状态介绍

关键字:

KingbaseES、对象状态、无效INVALID、有效VALID、状态刷新、状态蔓延

1.功能概述

PLSQL的对象函数、存储过程、触发器、包、包体、类型、类型体均支持状态属性。支持状态属性的 PLSQL对象在创建、调用或者重新编译时无任何异常抛出,则当前对象的状态会被置为有效状态,若PLSQL块中发生错误,则会当前对象置为无效状态,并将异常信息转换为警告信息输出,从而不影响数据库后续的操作执行。 KingbaseES提供GUC参数ora_func_style进行PLSQL对象状态的启停控制功能,默认值为false,当值为true时开启对象状态功能。

2.对象的有效状态与无效状态

PLSQL对象在创建时都需要根据创建时plsql块的编译结果设置相应的状态,若编译过程中plsql块内发生错误,则将当前创建对象创建为无效状态,并将错误降级为警告信息输出。若编译过程中plsql块内无错误发生,则正常创建当前对象并标记为有效状态。

2.1有效状态

PLSQL对象在创建、调用或者重新编译时无任何异常抛出,则当前对象的状态会被定义为有效(valid)状态。 示例:

--开启对象状态GUC参数
\set SQLTERM ;
set ora_func_style =on;
--创建存储过程无任何异常,查看创建后的存储过程状态为有效
\set SQLTERM /
CREATE OR REPLACE PROCEDURE pr1(p1 int) AS
	v1 int;
BEGIN
	v1 :=10;
	IF p1 >v1 THEN
		v1 :=v1+p1;
	END IF;
END;
/

file

--查看创建后的存储过程pr1状态为有效valid \set SQLTERM ; SELECT object_name,object_type,status FROM USER_OBJECTS WHERE object_name = 'PR1' ORDER BY object_type; file

2.2无效状态

PLSQL对象创建时PLSQL块中的任何错误如:语法错误、引用的对象不存在、类型不匹配等,则当前对象的状态会被定义为无效(invalid)状态。 示例:

--开启对象状态GUC参数
\set SQLTERM ;
set ora_func_style =on;
	--创建一个存储过程引用的对象表t1不存在,则存储过程对象为无效
\set SQLTERM /
CREATE OR REPLACE PROCEDURE pr2 AS
	v1 int;
BEGIN
	INSERT INTO t1 VALUES(1,'kingbase');
END;
/

file

--查看创建后的存储过程pr2状态为无效invalid
\set SQLTERM ;
SELECT object_name,object_type,status FROM USER_OBJECTS WHERE object_name = 'PR2' ORDER BY object_type;

file

3.对象状态刷新

PLSQL对象状态刷新的操作包括调用PLSQL对象的被动刷新和通过ALTER … COMPILE命令执行的主动刷新。

3.1被动刷新

PLSQL对象状态属性的被动刷新规则,在PLSQL对象调用时,对其进行有效性检查。若当前调用对象有效,则继续调用,若当前调用对象无效,则需要对其进行重新编译。若编译过程中未发现异常,则将对应对象的状态刷新为有效状态并继续调用,若重新编译过程中发现错误,则将其状态刷新为无效。

示例:

--开启对象状态GUC参数
\set SQLTERM ;
set ora_func_style =on;
CREATE TABLE t1(id int,name varchar(50));
	--创建一个存储过程引用表t1,存储过程创建成功状态为有效
\set SQLTERM /
CREATE OR REPLACE PROCEDURE pr3 AS
	v1 int;
BEGIN
	INSERT INTO t1 VALUES(1,'kingbase');
END;
/

file

--查看创建后的存储过程pr3状态为有效valid
\set SQLTERM ;
SELECT object_name,object_type,status FROM USER_OBJECTS WHERE object_name = 'PR3' ORDER BY object_type;

file

--删除表t1后再次查看存储过程pr3的状态刷新为无效invalid
\set SQLTERM ;
DROP TABLE t1;
SELECT object_name,object_type,status FROM USER_OBJECTS WHERE object_name = 'PR3' ORDER BY object_type;

file

3.2主动刷新

KingbaseES的主动刷新功能主要通过ALTER…COMPILE命令完成,支持以下对象的主动刷新。 函数:

ALTER FUNCTION [schema_name.]func_name COMPILE;

用于重新编译函数,刷新其状态属性。

存储过程:

ALTER PROCEDURE [schema_name.]proc_name COMPILE;

用于重新编译存储过程,刷新其状态属性。

触发器:

ALTER TRIGGER [schema_name.]trig_name COMPILE;

用于重新编译触发器,刷新其状态属性。

包:

ALTER PACKAGE [schema_name.]pkg_name COMPILE [ PACKAGE | SPECIFICATION | BODY ];

用于重新编译包,刷新其状态属性,可通过关键字PACKAGE指定是重新编译整个包,关键字SPECIFICATION指定重新编译包声明,关键字BODY指定重新编译包体。

类型:

ALTER TYPE [schema_name.]typ_name COMPILE [ SPECIFICATION | BODY ];

用于重新编译类型,刷新其状态属性,可通过关键字SPECIFICATION指定重新编译类型声明,关键字BODY指定重新编译类型定义。 示例:

-开启对象状态GUC参数
\set SQLTERM ;
set ora_func_style =on;
	--创建一个package,包存储过程引用表t1不存在 
\set SQLTERM /
CREATE OR REPLACE PACKAGE pkg1 AS
	PROCEDURE pr4;
END;
/
CREATE OR REPLACE PACKAGE BODY pkg1 AS
PROCEDURE pr4 AS
	v1 int;
BEGIN
	INSERT INTO t1 VALUES(1,'kingbase');
END;
END;
/

file

--查看创建后package状态,包头为有效valid,包体为无效invalid
\set SQLTERM ;
SELECT object_name,object_type,status FROM USER_OBJECTS WHERE object_name = 'PKG1' ORDER BY object_type;

file

--补齐被引用的表t1,查看package状态未发生变化
\set SQLTERM ;
CREATE TABLE t1(id int,name varchar(50));
SELECT object_name,object_type,status FROM USER_OBJECTS WHERE object_name = 'PKG1' ORDER BY object_type;

file

--手动刷新包体,查看package状态,包头和 包体均变成有效
\set SQLTERM ;
ALTER PACKAGE pkg1 COMPILE BODY;
SELECT object_name,object_type,status FROM USER_OBJECTS WHERE object_name = 'PKG1' ORDER BY object_type;

file

4.状态蔓延

存在依赖关系的PLSQL对象状态,会在被依赖对象的状态从有效改变为无效或被依赖对象被删除时发生改变,这种现象我们称之为状态的蔓延。 示例:

--开启对象状态GUC参数
\set SQLTERM ;
set ora_func_style =on;
	--创建一个存储过程pr4,引用存储过程pr01
\set SQLTERM /
CREATE OR REPLACE PROCEDURE pr01 AS
	v1 int;
BEGIN
	v1 :=10;
END;
/
CREATE OR REPLACE PROCEDURE pr4 AS
BEGIN
	Pr01();
END;
/

file

--查看存储过程pr4状态为有效
\set SQLTERM ;
SELECT object_name,object_type,status FROM USER_OBJECTS WHERE object_name = 'PR4' ORDER BY object_type;

file

--重建存储过程pr01,使其状态变为无效 \set SQLTERM / CREATE OR REPLACE PROCEDURE pr01 AS v1 int; BEGIN V2 :=10; END; /

file

----查看存储过程pr4状态也变为无效 \set SQLTERM ; SELECT object_name,object_type,status FROM USER_OBJECTS WHERE object_name = 'PR4' ORDER BY object_type;

file

更多信息,参见help.kingbase.com.cn/v8/index.ht…