|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
在JOIN操作中(需要从多个数据表提取数据时),MySQL只有在主键和外键的数据类型相同时才能使用索引。数据|数据库
档案办理体系——学籍翻译体系
一.案例先容
(部分举例)学籍办理数据库有两张表,是关于某高校先生信息和成就信息的,它们分离是emp表和
dept表,两张表的布局以下:
(1)先生基础信息表Student
(2)成就表Grade
请求以下:
1、依照上表布局创建响应的表,并每张表写进5组正当数据。
2、利用相干表,使得“成就优异(90分以上)的”的先生的奖学金津贴下跌20%。
3、创建日记,追踪津贴变化情形。
4、创建测试包。
二.案例的剖析与完成
夙昔面案例的先容不丢脸出,请求1考查点为基础SQL语句;请求2次要考查复合查询;请求3是考查
触发器的使用;请求4的考查面绝对多一些,不但考查了包的创立,并且也考查了在PL/SQL中的测试办法
。懂得了这些考查的常识点,就能够逐一往办理。
请求1:
起首依据后面表的布局能够创立两张表:
——创立先生基础信息表
createtableemp(emp_idnumber(5),emp_namevarchar2(20),emp_salarynumber(4));
——创立成就表
createtabledept(dept_idnumber(3),dept_namevarchar2(20),emp_idnumber(5));
创建了表以后就能够往内外面写数据了,这里把增加表纪录的代码写进到响应的存储历程。
/*给emp表增加纪录的存储历程*/
createorreplaceprocedureins_table_emp(p_emp_idnumber,p_emp_name
varchar2,p_emp_salarynumber)as
v_emp_idnumber:=p_emp_id;
v_emp_namevarchar2(20):=p_emp_name;
v_emp_salarynumber:=p_emp_salary;
begin
insertintoempvalues(v_emp_id,v_emp_name,v_emp_salary);
endins_table_emp;
/*给dept表增加纪录的存储历程*/
createorreplaceprocedureins_table_dept(p_dept_idnumber,p_dept_name
varchar2,p_emp_idnumber)as
v_dept_idnumber:=p_dept_id;
v_dept_namevarchar2(20):=p_dept_name;
v_emp_idnumber:=p_emp_id;
begin
insertintodeptvalues(v_dept_id,v_dept_name,v_emp_id);
endins_table_emp;
/*挪用响应的存储历程完成纪录增加*/
begin
ins_table_emp(10000,,4000);
ins_table_emp(10001,??èy,2300);
ins_table_emp(10002,3?t,3500);
ins_table_emp(10003,à???,3500);
ins_table_emp(10004,á?ò?,3500);
ins_table_dept(111,DD?t2?,10000);
ins_table_dept(111,DD?t2?,10001);
ins_table_dept(111,DD?t2?,10002);
ins_table_dept(112,??ê?2?,10003);
ins_table_dept(113,êD3?2?,10004);
end;
请求2:
给指定部门的员工加薪,这实践上是一个复合查询,起首必要把一切该部门的员工塞选出来,然后
对这些员工的薪水举行响应的修改。按照这一思绪,代码以下:
(必要注重的是:将要加薪的部门作为参数,如许的存储历程更有天真性。)
createorreplaceprocedureadd_salary(p_dept_namevarchar2)as
v_dept_namevarchar2(20):=p_dept_name;
begin
updateempsetemp.EMP_SALARY=emp.EMP_SALARY*1.2whereemp.EMP_IDin(select
emp.EMP_IDfromemp,deptwhereemp.EMP_ID=dept.EMP_IDanddept.DEPT_ID=??ê?2?);
endadd_salary;
请求3:
创建日记对薪水的变化情形构成一个追踪,也就是说,假如对某个人员的薪水举行变动就应当将其
响应的变动纪录全体记上去。假如对emp表的salary字段创立一个触发器,来监督对salary的变动,把每
次变动举行纪录,如许就到达了请求3的目标了。
createorreplacetriggerprint_salary_change
beforedeleteorinsertorupdateonemp--触发事务
foreachrow--每修正一行都必要挪用此历程
declare--只要触发器的声明必要declare,历程和函数都不必要
salary_balancenumber;
begin
--:new与:old分离代表该行在修正前和修正后的纪录
salary_balance=:new.salary=:old.salary;
dbms_output.PUT_LINE(oldsalaryis:||:old.salary);
dbms_output.PUT_LINE(oldsalaryis:||:new.salary);
dbms_output.PUT_LINE(oldsalaryis:||to_char(salary_balance));
endprint_salary_change;
请求4:
与其他言语(c/c++等)比拟,PL/SQL的测试有其分歧的地方,归结上去有三种办法:
1、利用DBMS_OUTPUT包的PUT_LINE办法来显现两头变量,以此来察看程序是不是存在逻辑毛病。
2、拔出测试表的办法。即创立一个一时的两头表,然后把一切触及到的两头变量的了局都作为纪录
拔出到两头表中,如许能够查询表中的了局来察看程序的实行情形。
3、利用非常处置手腕,对可疑的程序段利用begin…end,然后能够在exception里举行非常捕捉
处置。
这里筹办利用第二种办法来创建一个测试包,PL/SQL里包的观点相似于面向工具里的类的观点,包
将一组操纵和属性封装在一同,不但加强了程序的模块化,并且因为封装了更多的操纵和属性而进步了
实行效能。创建一个PL/SQL必要两个步骤:起首要创建包头,相似于创建一个类的头文件,内里次要对
包中的历程,函数和变量的声明;第二部分次要是包体部分,完成后面声明的历程和函数,别的还必要
对包举行初始化等事情。
依据这一思绪,创建测试包以下:
/*包头部分*/
createorreplacepackagedebugas
proceduredebug(v_descriptionvarchar2,v_valueOfvariablevarchar2)
procedurereset;
v_numberOfLinenumber;
enddebug;
/*包体部分*/
createorreplacepackagebodydebugas
proceduredebug(v_descriptionvarchar2,v_valueOfvariablevarchar2)is
begin
insertintodebugtable
values(v_numberOfLine,v_description,v_valueOfvariable);
v_numberOfLine:=v_numberOfLine+1;
enddebug;
procedureresetis
begin
v_numberOfLine:=1;
deletefromdebugtable;
endreset;
/*初始化部分*/
begin
reset;
enddebug;
出于效率方面的考虑,InnoDB数据表的数据行级锁定实际发生在它们的索引上,而不是数据表自身上。显然,数据行级锁定机制只有在有关的数据表有一个合适的索引可供锁定的时候才能发挥效力。 |
|