注册
数据库基础相关学习及测试
专栏/技术分享/ 文章详情 /

数据库基础相关学习及测试

雾岛听风 2026/09/04 89 0 0
摘要

学习测试

  • ACID特性
  • 存储过程
  • 视图、包
  • 索引
  • 函数

数据库需要支持事务的 ACID 四大特性,支持事务的显式开启、提交和回滚

原子性(Atomicity)

测试名称:事务原子性测试

测试目的:测试数据库中事务的原子性操作,一个事务要么全部提交成功,要么全部失败回滚,不能只执行其中的一部分操作

预置条件

测试步骤:1、建表

create table EMP ( EMPNO NUMBER(4) PRIMARY KEY, ENAME VARCHAR2(10), JOB VARCHAR2(9), MGR NUMBER(4), HIREDATE DATE, SAL NUMBER(7,2), COMM NUMBER(7,2), DEPNO NUMBER(4) ); CREATE TABLE Dept( DEPTNO NUMBER(4), DNAME VARCHAR2(14), LOC VARCHAR2(13) );

img_001.png

测试事务提交成功

SET AUTOCOMMIT OFF INSERT INTO Dept VALUES (20,'RESEARCH','DALLAS'); INSERT INTO EMP VALUES (7369,'SMITH','CLERK',7902,to_date('17-12-1980','dd-mm-yyyy'),800,null,20);

img_002.png

commit;

查询数据是否已插入:

select * from dept; select * from emp;

img_003.png

3、测试事务执行失败

SET AUTOCOMMIT OFF delete from emp where empno=7369; delete from dept where deptno=20;

直接断开会话

img_004.png

--再次登录查询—未删除 select * from dept; select * from emp;

img_005.png

预期结果:事务不提交、通过重启数据库/kill事务涉及的会话,不存在部分成功,部分失败的情况,满足事务原子性

测试结果:满足事务原子性

一致性(Consistency)

测试名称:事务一致性测试

测试目的:测试数据库中事务的一致性操作,事务前后数据的完整性必须保持一致

预置条件:数据库运行正常

测试步骤

--建表 --drop table test1; --drop table test2; create table test1(id int,mon int); create table test2(id int,mon int); insert into test1 values(1,500); insert into test2 values(1,500); commit;

img_006.png

--查看数据 select * from test1; select * from test2;

img_007.png

--转账示例 update test1 set mon=mon-100 where id=1; update test2 set mon=mon+100 where id=1; commit;

img_008.png

--查看数据是否一致 select * from test1; select * from test2;

img_009.png

预期结果:创建两个表,模拟转账场景,事务完成后,验证2个表数据增减相当,满足事务一致性

测试结果:支持事务一致性

隔离性(Isolation)

测试名称:事务隔离性测试

测试目的:测试数据库中事务的隔离性操作,多个事务并发执行时,彼此之间不应该存在相互影响。

预置条件:数据库运行正常

测试步骤

--建表 --drop table test; create table test(id int ,name varchar(10)); insert into test values(1,'a');

img_010.png

--会话2

select * from test;–结果为空

img_011.png

--会话1 commit;

img_012.png

--会话2

select * from test;–有一条数据

img_013.png

预期结果:创建两个会话,A会话执行事务,对数据修改后不提交事务,A会话事务不提交前,B会话对A事务涉及的数据修改不可见,支持事务隔离性

测试结果:支持事务隔离性

持久性(Durability)

Ⅰ、注意此处不要使用ctrl+z强制退出会话,会话没有正常关闭,事务也没有回滚,锁就残留下来了 同时重新打开disql时也不会显示刚刚添加的数据

测试名称:事务持久性测试

测试目的:测试数据库中事务的持久性操作,事务正常执行完毕后,对数据库的修改是永久性的。即事务的修改操作已经记录到了存储介质中。

预置条件

--emp,dept表已存在 create table EMP ( EMPNO NUMBER(4) PRIMARY KEY, ENAME VARCHAR2(10), JOB VARCHAR2(9), MGR NUMBER(4), HIREDATE DATE, SAL NUMBER(7,2), COMM NUMBER(7,2), DEPNO NUMBER(4) ); CREATE TABLE Dept( DEPTNO NUMBER(4), DNAME VARCHAR2(14), LOC VARCHAR2(13) ); select table_name from user_tables where table_name = 'EMP' or table_name = 'DEPT';

测试步骤:1、事务提交成功

SET AUTOCOMMIT OFF INSERT INTO Dept VALUES (10,'ACCOUNTING','NEW YORK'); INSERT INTO EMP VALUES (7782,'CLARK','MANAGER',7839,to_date('9-6-1981','dd-mm-yyyy'),2450,NULL,10); commit;

img_014.png

2、直接关闭会话

3、重新打开会话,查询数据是否已存在:

select * from dept; select * from emp;

img_015.png

预期结果:事务提交后,重启数据库实例/kill事务涉及的会话,数据不丢失,满足事务持久性

测试结果:支持事务持久性

数据库支持创建、修改、删除和查看存储过程,支持存储过程的调用

测试名称:数据库支持创建、修改、删除和查看存储过程,支持存储过程的调用

测试目的:测试数据库支持创建,修改,删除共和查看存储过程,支持存储过程的调用

预置条件:数据库运行正常

测试步骤:存储过程的创建

CREATE PROCEDURE SYSDBA.TEST02() IS aa varchar(10); begin aa:='hello word'; print(aa); end;

存储过程的修改

CREATE OR REPLACE PROCEDURE "SYSDBA"."test" AUTHID DEFINER as BEGIN dbms_lock.sleep(4); END;

img_016.png

存储过程的查看

select TXT from SYSTEXTS where ID = (select OBJECT_ID from dba_objects where OBJECT_NAME = 'TEST02' and OBJECT_TYPE = 'PROCEDURE');

img_017.png

存储过程的调用

call TEST02;

img_018.png

存储过程的删除

drop procedure test02;

img_019.png

测试结果:数据库支持创建、修改、删除和查看存储过程,支持存储过程的调用

数据库支持创建、修改、删除和查看存储函数,支持存储函数的调用与运行

测试名称:数据库支持创建、修改、删除和查看存储过程,支持存储过程的调用

测试目的:测试数据库支持创建,修改,删除共和查看存储过程,支持存储过程的调用

预置条件

测试步骤创建:

CREATE OR REPLACE FUNCTION F_FUT_CCHS_BDCS FOR CALCULATE RETURN INT IS BEGIN RETURN 1; END;

img_020.png

修改:

CREATE OR REPLACE FUNCTION F_FUT_CCHS_BDCS FOR CALCULATE RETURN INT IS BEGIN RETURN 2; END;

img_021.png

查看

select TXT from SYSTEXTS where ID = (select OBJECT_ID from dba_objects where OBJECT_NAME = 'F_FUT_CCHS_BDCS' and OBJECT_TYPE = 'FUNCTION');

批注(派大星 2026-08-12):???

img_022.png

img_023.png

调用

select F_FUT_CCHS_BDCS ();

img_024.png

删除

drop function F_FUT_CCHS_BDCS;

img_025.png

预期结果:测试成功

测试结果:数据库支持创建、修改、删除和查看存储过程,支持存储过程的调用

数据库创建包

测试名称:数据库创建包

测试目的:测试数据库创建包

预置条件:数据库运行正常

测试步骤

--创建表,执行如下SQL命令 CREATE TABLE TAB_FUT_BAGL_CJ(ID INT IDENTITY, NAME VARCHAR(100), CITY VARCHAR(100));

INSERT INTO TAB_FUT_BAGL_CJ(NAME, CITY) VALUES('TOM','武汉');

img_026.png

--创建包规范,执行如下SQL命令 CREATE OR REPLACE PACKAGE PKG_FUT_BAGL_CJ IS E_NOPERSON EXCEPTION; PERSONCOUNT INT; PCUR CURSOR; PROCEDURE ADDPERSON(PNAME VARCHAR(100), PCITY VARCHAR(100)); PROCEDURE REMOVEPERSON(PNAME VARCHAR(100), PCITY VARCHAR(100)); PROCEDURE REMOVEPERSON(PID INT); FUNCTION GETPERSONCOUNT RETURN INT; PROCEDURE PERSONLIST; END PKG_FUT_BAGL_CJ;

img_027.png

--创建包体,执行如下SQL命令 CREATE OR REPLACE PACKAGE BODY PKG_FUT_BAGL_CJ AS PROCEDURE ADDPERSON(PNAME VARCHAR(100), PCITY VARCHAR(100)) AS BEGIN INSERT INTO TAB_FUT_BAGL_CJ(NAME, CITY) VALUES(PNAME, PCITY); PERSONCOUNT = PERSONCOUNT + SQL%ROWCOUNT; END ADDPERSON; PROCEDURE REMOVEPERSON(PNAME VARCHAR(100), PCITY VARCHAR(100)) AS BEGIN DELETE FROM TAB_FUT_BAGL_CJ WHERE NAME LIKE PNAME AND CITY LIKE PCITY; PERSONCOUNT = PERSONCOUNT - SQL%ROWCOUNT; END REMOVEPERSON; PROCEDURE REMOVEPERSON(PID INT) AS BEGIN DELETE FROM TAB_FUT_BAGL_CJ WHERE ID = PID; PERSONCOUNT = PERSONCOUNT - SQL%ROWCOUNT; END REMOVEPERSON; FUNCTION GETPERSONCOUNT RETURN INT AS BEGIN RETURN PERSONCOUNT; END GETPERSONCOUNT; PROCEDURE PERSONLIST AS DECLARE V_ID INT; V_NAME VARCHAR(100); V_CITY VARCHAR(100); BEGIN IF PERSONCOUNT = 0 THEN RAISE E_NOPERSON; END IF; OPEN PCUR FOR SELECT ID, NAME, CITY FROM TAB_FUT_BAGL_CJ; LOOP FETCH PCUR INTO V_ID,V_NAME,V_CITY; EXIT WHEN PCUR%NOTFOUND; PRINT ('NO.' + (CAST (V_ID AS VARCHAR(100))) + ' ' + V_NAME + '????' + V_CITY ); END LOOP; CLOSE PCUR; END PERSONLIST; BEGIN SELECT COUNT(*) INTO PERSONCOUNT FROM TAB_FUT_BAGL_CJ; END PKG_FUT_BAGL_CJ;

img_028.png

测试结果:数据库支持创建包

数据库支持创建、删除、修改、查看视图

测试名称:数据库支持创建、删除、修改、查看视图

测试目的:数据库支持创建、删除、修改、查看视图

预置条件:数据库正常运行

测试步骤:测试创建视图

1、–创建表操作,执行如下SQL命令

create table TEST_STGL_CJ(id int, name varchar(10), sex varchar(10), bithdate date, house_place varchar, classid varchar(10));

2、–插入数据,执行如下SQL命令

insert into TEST_STGL_CJ values(10004, 'xuchang','female', '1993-7-13','hubeiwuhan','3-2');

3、–创建视图,执行如下SQL命令

create or replace view TEST_STGL_CJ_V as select id, name, house_place from TEST_STGL_CJ where sex='female';

4、查看视图

select * from TEST_STGL_CJ_V

img_029.png

修改视图

1、–修改表操作,执行如下SQL命令

alter table TEST_STGL_CJ add column (education varchar);

2、–检查当前系统表中视图列定义是否有效,执行如下SQL命令

select SF_VIEW_EXPIRED('SYSDBA','TEST_STGL_CJ_V');

img_030.png

3、–编译视图,执行如下SQL命令

alter view TEST_STGL_CJ_V compile;

img_031.png

删除视图

drop view TEST_STGL_CJ_V;

img_032.png

测试结果:数据库支持创建、删除、修改、查看视图

数据库支持普通索引(B 树)

测试名称:Btree索引测试

测试目的:Btree单列索引创建与使用操作

预置条件:一.测试方式:

1.创建测试表

2.插入数据

3.创建数据表中单列btree索引

测试步骤:创建单列B树单列索引

--drop table test;

create table test as select * from dba_objects;–创建测试表

create index idx_test_object_id on test(object_id);–创建索引

select * from test where "TEST"."OBJECT_ID"='1';

img_033.png

查看执行计划确认索引是否生效

Explain select * from test where "TEST"."OBJECT_ID"='1';

img_034.png

drop index idx_test_object_id;

测试结果:1.可成功创建索引

2.执行相关sql,验证此索引可正确被优化器识别使用。

数据库支持函数索引

测试名称:Function index创建与删除

测试目的:Function index创建与删除

预置条件:1.创建测试表

2.插入数据

3.创建数据表中单列函数索引

测试步骤:1. 创建函数索引:

--drop table test; create table test( id number, t_point datetime, name VARCHAR(128), par_2 number, par_3 number, par_4 number, par_5 number, par_6 number, par_7 number, par_8 number, par_9 number, par_10 number);

create index t_idx04 on test(upper(name)); --创建函数索引

insert into test select level,sysdate,'aa_' || level, DBMS_RANDOM.RANDOM, DBMS_RANDOM.RANDOM, DBMS_RANDOM.RANDOM, DBMS_RANDOM.RANDOM, DBMS_RANDOM.RANDOM, DBMS_RANDOM.RANDOM, DBMS_RANDOM.RANDOM, DBMS_RANDOM.RANDOM, DBMS_RANDOM.RANDOM

from dual connect by level <=150;–插入测试数据

Commit; --提交事务

select count(*) from test;

dbms_stats.gather_table_stats(ownname=>‘SYSDBA’,tabname=>‘TEST’,CASCADE=>true);–收集统计信息

select a.index_name,a.index_type,b.column_name from dba_indexes a,dba_ind_columns b where a.index_name=b.index_name and a.table_name='TEST';

img_035.png

explain select name from test where upper(name)=‘AA_150’; --查看索引是否生效

img_036.png

drop index t_idx04;

explain select name from test where upper(name)=‘AA_150’; --不走索引

img_037.png

测试结果:1.可成功创建索引

2.执行相关sql,验证此索引可正确被优化器识别使用。

1.9.3 数据库支持复合索引(组合索引)

测试名称:唯一多列索引的创建与使用

测试目的:唯一多列索引的创建与使用

预置条件:1.创建测试表

2.插入数据

3.创建数据表中多列复合唯一索引

测试步骤:1. 创建函数索引:

--drop table test; create table test( id number, t_point datetime, name VARCHAR(128), par_2 number, par_3 number, par_4 number, par_5 number, par_6 number, par_7 number, par_8 number, par_9 number,

par_10 number); --创建测试表

create unique index t_idx07 on test(id,name,par_2,par_3,par_4);–创建多列唯一索引

insert into test select level,sysdate,'aa_' || level, DBMS_RANDOM.RANDOM, DBMS_RANDOM.RANDOM, DBMS_RANDOM.RANDOM, DBMS_RANDOM.RANDOM, DBMS_RANDOM.RANDOM, DBMS_RANDOM.RANDOM, DBMS_RANDOM.RANDOM, DBMS_RANDOM.RANDOM, DBMS_RANDOM.RANDOM

from dual connect by level <=15000;–插入测试数据

Commit; --提交事务

dbms_stats.gather_table_stats(ownname=>‘SYSDBA’,tabname=>‘TEST’,CASCADE=>true);–收集统计信息

select a.index_name,a.index_type,b.column_name from dba_indexes a,dba_ind_columns b where a.index_name=b.index_name and a.table_name='TEST';

img_038.png

explain select name from test where id=150; --查看唯一索引是否生效

img_039.png

drop index t_idx07;

explain select name from test where id=150; --查看唯一索引已失效

img_040.png

测试结果:1.可成功创建索引

2.执行相关sql,验证此索引可正确被优化器识别使用。

数据库支持基础函数,包括字符处理函数、日期处理函数、数值处理函数、条件判断函数

测试名称:数据库支持基础函数,包括字符处理函数、日期处理函数、数值处理函

数、条件判断函数

测试目的:数据库支持基础函数,包括字符处理函数、日期处理函数、数值处理函

数、条件判断函数

预置条件:数据库运行正常

测试步骤

--创建测试用例

1、数值函数ROUND

SELECT ROUND(15.20);

img_041.png

2、字符串函数ASCII

SELECT ASCII(‘B’) ,ASCII(‘中’);

img_042.png

3、日期处理函数

Select sysdate(); Select to_date(‘20220202’)from dual;

img_043.png

img_044.png

4、条件判断函数

SELECT DECODE(1, 1, 'A', 2, 'B');

img_045.png

预期结果:数据库支持基础函数,包括字符处理函数、日期处理函数、数值处理函

数、条件判断函数

测试结果:数据库支持基础函数,包括字符处理函数、日期处理函数、数值处理函

数、条件判断函数

数据库支持高级函数,包括大对象对应的函数

测试名称:数据库支持高级函数,包括大对象对应的函数

测试目的:测试大对象函数EMPTY_BLOB初始化blob字段

预置条件:数据库运行正常

测试步骤

--创建测试用例

1、创建表

CREATE TABLE test_eb (C1 BLOB, C2 INT); INSERT INTO test_eb VALUES(EMPTY_BLOB(),1); INSERT INTO test_eb VALUES(NULL,2); INSERT INTO test_eb VALUES(0X123,3); commit;

2、查询数据

SELECT LENGTHB(C1) FROM test_eb;

img_046.png

预期结果:数据库支持高级函数,包括大对象对应的函数

测试结果:数据库支持高级函数,包括大对象对应的函数

备注:清除测试用例

Drop table test_eb ;

数据库支持高级函数,包括 XML 类型与 JSON 类型函数

测试名称:数据库支持高级函数,包括 XML 类型与 JSON 类型函数

测试目的:数据库支持高级函数,包括 XML 类型与 JSON 类型函数

测试步骤

--创建测试用例

1、测试创建包含JSON数据类型的表

CREATE TABLE TEST_JSON (id int NOT NULL, date_loaded TIMESTAMP (6) WITH TIME ZONE, po_document VARCHAR CONSTRAINT ensure_json CHECK (po_document IS JSON));

2、插入JSON数据,执行如下SQL命令

INSERT INTO TEST_JSON VALUES (1,SYSTIMESTAMP,'{ "PONumber" : 1600, "Reference" : "ABULL-20140421", "Requestor" : "Alexis Bull", "User" : "ABULL", "CostCenter" : "A50", "Special Instructions" : null, "AllowPartialShipment" : true } '); Commit;

3、查询json数据,执行如下SQL命令

SELECT json_query(po_document,'$.*' RETURNING VARCHAR WITH WRAPPER ERROR ON ERROR) from TEST_JSON;

img_047.png

img_048.png

img_049.png

4、创建包含XML数据类型的表

create table TEST_XML ( psn_code NUMBER(18) not null, psn_verson VARCHAR2(17), psn_xml xmltype, update_time DATE, update_psn_code NUMBER(18) );

5、插入数据

--插入数据: insert into TEST_XML (PSN_CODE, PSN_VERSON, PSN_XML, UPDATE_TIME, UPDATE_PSN_CODE) values (333, '王五', '<?xml version="1.0" encoding="UTF-8"?><data><basic_info><psn_code>100018476</psn_code><zh_name>添加11</zh_name><en_name/><gender_value/><other_name/><card_type_value></card_type_value><card_type_name></card_type_name><card_code/><ethnicity_value/><ethnicity_name/><birthday/><org_name/><org_code/><department/><position/><prof_title_value/><prof_title_name/><educate_value/><educate_name/><degree_value/><degree_name/><degree_country_value/><degree_country_name/><degree_year/><graduate_college/><degree_college/><doctoral_value/><doctoral_name/><academician_value/><academician_name/><receive_title_value/><receive_title_name/><post_code/><http/><address/><bank_name/><bank_orgname/><bank_account/><work_experience/><working_performance/><allowance/><honorary_title/><social_appointments/><other/></basic_info><content><file_code8/></content><valid><valid_card/></valid><contact><major/><major_work/><email>abcncc1@123.com</email><tel_work/><tel_home/><mobile>123456xxxxx</mobile><fax/></contact><researches><research seq_no="1"><zh_keywords><keyword seq_no="1">1</keyword><keyword seq_no="2"/><keyword seq_no="3"/><keyword seq_no="4"/><keyword seq_no="5"/></zh_keywords><subject_code>120</subject_code><en_keywords><keyword seq_no="1"/><keyword seq_no="2"/><keyword seq_no="3"/><keyword seq_no="4"/><keyword seq_no="5"/></en_keywords><subject_name>信息科学与系统科学</subject_name><research_area_code/><research_area_name/></research><research seq_no="2"><zh_keywords><keyword seq_no="1">1</keyword><keyword seq_no="2"/><keyword seq_no="3"/><keyword seq_no="4"/><keyword seq_no="5"/></zh_keywords><subject_code>130</subject_code><en_keywords><keyword seq_no="1"/><keyword seq_no="2"/><keyword seq_no="3"/><keyword seq_no="4"/><keyword seq_no="5"/></en_keywords><subject_name>力学</subject_name><research_area_code/><research_area_name/></research><research seq_no="3"><subject_code/><subject_name/><research_area_code/><research_area_name/></research><research seq_no="4"><subject_code/><subject_name/><research_area_code/><research_area_name/></research><research seq_no="5"><subject_code/><subject_name/><research_area_code/><research_area_name/></research></researches><disciplines><discipline seq_no="1"><zh_keywords><keyword seq_no="1">1</keyword><keyword seq_no="2"/><keyword seq_no="3"/><keyword seq_no="4"/><keyword seq_no="5"/></zh_keywords><discipline_code>B</discipline_code><en_keywords><keyword seq_no="1"/><keyword seq_no="2"/><keyword seq_no="3"/><keyword seq_no="4"/><keyword seq_no="5"/></en_keywords><discipline_name>化学科学</discipline_name></discipline><discipline seq_no="2"><discipline_code/><discipline_name/></discipline><discipline seq_no="3"><discipline_code/><discipline_name/></discipline><discipline seq_no="4"><discipline_code/><discipline_name/></discipline><discipline seq_no="5"><discipline_code/><discipline_name/></discipline></disciplines></data>', null, 444); commit;

6、查询XML数据

select existsnode(cx.psn_xml,'/data/basic_info/zh_name') from TEST_XML cx where cx.psn_code=333;

img_050.png

预期结果:数据库支持高级函数,包括 XML 类型与 JSON 类型函数

测试结果:数据库支持高级函数,包括 XML 类型与 JSON 类型函数

备注:清除测试用例

Drop table test_JSON; Drop table test_XML;

https://eco.dameng.com

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服