1.第四代编程语言
PL/SQL是一种高级数据库程序设计语言,该语言专门用于在各种环境下对Oracle数据库进行访问。由于该语言继承于数据库服务器中,所以PL/SQL代码可以对数据记性快速搞笑的处理。
SQL是先进的第四代程序设计语言,使用这种语言只需对要完成的任务进行描述,而不必指定实现任务的具体方法。
比如一个删除操作用SQL:
delet from student where condition
然而要是应用第三代的编程语言,C、java都需要进行循环实现的。
2.为什么要提出PL/SQL
SQL作为第四代编程语言使用起来非常的简单,对数据的具体处理完全由该类语言的运行时系统进行实现。而某些情况下,第三代语言使用的过程结构在表达某些程序过程来说是非常有用的。
PL/SQL是将第四代语言的枪法功能和灵活性与第三代语言的过程结构的优势融为一体。
PL/SQL代表面向过程化的怨言与SQL语言的结合。它实现了将过程结构和Oracle SQL的无缝集成。
3.PL/SQL实现循环插入
declare
LoopCounter NUMBER(12):=1000;
v_createDate DATE:=to_date('<st1:chsdate w:st="on" year="2007" month="7" day="12" islunardate="False" isrocdate="False">2007-7-12</st1:chsdate>','yy-mm-dd');
v_sts CHAR(1):='A';
v_stsDate DATE:=to_date('<st1:chsdate w:st="on" year="2007" month="7" day="12" islunardate="False" isrocdate="False">2007-7-12</st1:chsdate>','yy-mm-dd');
begin
loop
insert into project(project.project_id,create_date,sts,sts_date) values(LoopCounter,v_createDate,v_sts,v_stsDate);
commit;
LoopCounter:=LoopCounter+1;
exit when(LoopCounter>1010);
end loop;
end;
这个是一个利用
PL/SQL实现向project表中循环插入10条记录的sql代码。
利用for来实现上面的例子:
Begin
For LoopCounter in 1000..1010 loop
insert into project(project.project_id,create_date,sts,sts_date) values(LoopCounter,v_createDate,v_sts,v_stsDate);
commit;
End
4.游标的使用
带参数的游标
与存储过程和函数相似,可以将参数传递给游标并在查询中使用。这对于处理在某种条件下打开游标的情况非常有用。它的语法如下:
CURSOR cursor_name[(parameter[,parameter],...)] IS select_statement;
定义参数的语法如下:
Parameter_name [IN] data_type[{:=|DEFAULT} value]
与存储过程不同的是,游标只能接受传递的值,而不能返回值。参数只定义数据类型,没有大小。
另外可以给参数设定一个缺省值,当没有参数值传递给游标时,就使用缺省值。游标中定义的参数只是一个占位符,在别处引用该参数不一定可靠。
在打开游标时给参数赋值,语法如下:
OPEN cursor_name[value[,value]....];
参数值可以是文字或变量。
参数值可以是文字或变量。
例:
DECALRE
CURSOR c_dept IS SELECT * FROM dept ORDER BY deptno;
CURSOR c_emp (p_dept VARACHAR2) IS
SELECT ename,salary
FROM emp
WHERE deptno=p_dept
ORDER BY ename
r_dept DEPT%ROWTYPE;
v_ename EMP.ENAME%TYPE;
v_salary EMP.SALARY%TYPE;
v_tot_salary EMP.SALARY%TYPE;
BEGIN
OPEN c_dept;
LOOP
FETCH c_dept INTO r_dept;
EXIT WHEN c_dept%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Department:'|| r_dept.deptno||'-'||r_dept.dname);
v_tot_salary:=0;
OPEN c_emp(r_dept.deptno);
LOOP
FETCH c_emp INTO v_ename,v_salary;
EXIT WHEN c_emp%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Name:'|| v_ename||' salary:'||v_salary);
v_tot_salary:=v_tot_salary+v_salary;
END LOOP;
CLOSE c_emp;
DBMS_OUTPUT.PUT_LINE('Toltal Salary for dept:'|| v_tot_salary);
END LOOP;
CLOSE c_dept;
END;
5. PL/SQL中属性的类型:
%type引用数据库列.。
%rowtype 代表表中的行。
6.存储过程的编写
存储过程是一种运行在服务器端的,sql语句的集合。可以处理一个完整的业务,而其执行是在数据库服务器端的。
下面就Oracle中实现存储过程的编写和调用进行讲解:
下面写了一个删除项目信息的存储过程:
下面是调用代码:
SQL> begin
2 deleteProjec(1001);
3 commit;
4 end;
5 /
begin
p project%rowtype;
select * into p from project where project.project_id=1001;
Dbms_Output.put(p.project_id);
end;
7.
包
一个包中可以编写多个过程或者函数。
8. 动态SQL
借助于动态SQL,一个PL/SQL应用可以在运行期间构造并执行SQL语句。
9. 对象类型
10. 集合
11.java 中调用存储过程
12.触发器
12.1.DML触发器
12.2.替代触发器
12.3创建触发器