--Oracle之所以强大,就是因为有PLSQL编程这个技术
--那么PL/SQL究竟是什么
--1、理解oracle的PL/SQL概念
--2、掌握PL/SQL编程技术(包括编写过程、函数、触发器)
--PL/SQL(proecdural language/sql)是Oracle在标准的SQL语言上的扩展。
--PL/SQL不仅允许嵌入sql语言,还可以定义变量和常量,允许使用条件语句和
--循环语句,允许使用例外处理各种错误,这样使得它的功能变得更加强大。
--1、用PL/SQL这种语言来编写存储过程,函数,触发器
--2、这三者是在oracle中
--3、PL/SQL是非常强大的数据库过程语言
--4、过程,函数可以在Java程序中调用
--为什么要学PL/SQL呢?
--提高应用程序的运行性能(省略了Java程序传递到数据库后编译成数据库可识别代码的过程,Java程序可以直接调用过程)
--模块化的设计思想(将sql语句写成模块,把它写成一个个存储过程,然后直接调用存储过程,比如将分页写成存储过程,直接调用分页存储过程)
--比如说分页的过程:到时候直接传几个参数,传一个表名,传一个我要得到第几页,每一页显示几条的记录 ,一下就给你返回来了
----比如说订单的过程,转账的过程
--这样公司往往会将一些例如分页的这些需要很多代码的交给一个人去写成过程
--减少网络传输量
--提高安全性
--老师寄语
--传统的方法是用sql语句传给数据库,在真正的软件公司,它的数据库很有可能跟你调用的语句不在同一个机器上,那你肯定有一个网络传输的过程
--假设你这个sql语句很多,就很费时间,而如果将其统一到一个过程中,量一下子就减少了,减少的可不止是10几个字节,一天下来网络量就很大了。
--有时候甚至可以节约2,3G
--程序运行起来只是第一步,要让你的程序性能最优,那就体现了程序猿的价值了
--现在招聘的人他愿意招聘有经验的人,因为除了会做,还得最优
--别看都是笔记本名,IBM就是扎实,比神州笔记本结实很多
--所以,程序是有灵魂,一定要让你的东西做得好一点,其实编程不是我们想象的那样,
--年轻的,身体好的,他就一定怎么样,现在真正有经验的都是30岁,或者40岁的,像美国,
--上30多岁,40多岁的程序员很多,并不是国内所说的编程就是年轻人干的活,越小越好,
--一个程序员的成长是要有一个过程的,大家不要担心技术这个到了30岁,40岁过后就干不了活了
--不会那样子,现在招聘的要30岁以下的,招聘的档次就是比较低的,
--一般要招项目经理以上的,必须得30岁以上,美国,日本,你拿个名片出来说你是项目经理,
--那是因为他们觉得能到项目经理或者高级工程师,那是一个多高的职位啊,那就相当于很厉害了
--监狱长直到麦克是工程师,他马上就另眼相看了
--在国外要拿到工程师认证是很难的,如果你说你是项目经理,那就是很牛很牛的人了
--在国内变得不一样,去了就是工程师,干一年就是高级工程师
--其实我们做一样东西还是要有时间,慢慢慢慢才会成长的,把我们的程序做得有灵魂,那样的话你会看到技术另外一面的东西
--安全:过程把表名,字段名都封装到过程中去了,而你在调用的时候只是看到了存储过程的名字
--不好的地方:移植性不好,你把函数或者触发器写好了,如果你换了数据库,比如Oracle换db2,那你的存储过程全部要重写
--可是真正要遇到这种切换数据库很少
--用什么编写pl/sql
--sqlplus开发工具
--sqlplus是Oracle公司提供的一个工具,这个因为我们在以前介绍过的,
--举一个简单案例:
--编写一个存储过程,该过程可以向某表中添加记录
--pl/sql developer开发工具
--适用于开发pl/sql块的集成开发环境(ide),他是一个独立的产品,而不是Oracle的一个附带品
--举一个简单案例
--编写一个存储过程,该过程可以删除某表记录
--编写一个存储过程,该过程可以向某表中添加记录
--1、创建一个简单的表
--create table mytest(name varchar2(30),passwd varchar2(30));
--2、创建过程
--create or replace procedure sp_pro1 is
--begin
----执行部分
--insert into mytest values(‘aa’,‘dd’);
--end;
--/
--然后再换行即可
--如果有执行错误,如何查看错误信息?
--show error;
--如何调用该过程?
--1、exec 过程名(参数值1,参数值2,。。。)
--2、call 过程名(参数值1,参数值2,。。。)
--存储过程可以多次执行
create or replace procedure sp_pro2 is
begin
delete from student where name='hyd';
end;
exec sp_pro2;
--pl/sql基础
--开发人员使用pl/sql编写应用模块时,不仅需要掌握sql语句的编写方法,
--还要掌握pl/sql语句及语法规则。
--pl/sql编程可以使用变量和逻辑控制语句,从而可以编写非常有用的功能模块。
--比如:分页存储过程模块,订单处理存储过程模块,转账存储过程模块。。
--而且如果使用pl/sql编程,我们可以轻松的完成非常复杂的查询要求。
--pl/sql可以做什么
--简单分类
--块(编程)--过程(存储过程)
--函数
--触发器
--包
--编写规范
--注释
--单行注释,多行注释(/*........*/)
--标识符号的命名规范
--当定义变量时,建议用v_作为前缀 v_sal
--当定义常量时,建议用c_作为前缀 c_rate
--当定义游标时,建议用_cursor作为前缀 emp_cursor
--当定义例外时,建议用e_作为前缀 e_error
--pl/sql块介绍
--块(block)是pl/sql的基本程序单元,编写pl/sql程序实际上就是编写pl/sql块。
--要完成相对简单的应用功能,可能只需要编写一个pl/sql块;但是如果想实现复杂的功能,
--可能需要在一个pl/sql块中嵌套其他的pl/sql块。
--pl/sql块的结构
--pl/sql块由三部分构成:定义部分,执行部分,倒外处理部分。
如下所示:
declear
/*定义部分——定义常量,变量,游标,例外,复杂数据类型*/
begin
/*执行部分——要执行的pl/sql语句和sql语句*/
exception
/*例外处理部分——处理运行的各种错误*/
end;
--定义部分是从declear开始的,该部分是可选的
--执行部分是从begin开始的,该部分是必须的
--例外处理部分是从exception开始的,该部分是可选的
pl/sql块的实例
实例1--只包括执行部分的pl/sql块
set serveroutput on; --打开输出选项
begin
dbms_output.put_line('hello');
end;
--相关说明:
dbms_output是Oracle所提供的包(类似Java的开发包),该包包括一些过程,put_line就是dbms_output包的一个过程
--set serveroutput off; 关闭输出选项
--pl/sql块的实例2
declare
v_ename varchar2(5); --定义字符串变量
begin
select ename into v_ename from emp where empno=&no;
dbms_output.put_line('雇员名:'|| v_ename );
end;
/
--相关说明:
--& 表示要接收从控制台输入的变量
--把用户的工资也显示
declare
v_ename varchar2(5); --定义字符串变量
v_sal number(7,2);
begin
select ename,sal into v_ename,v_sal from emp where empno=&no;
dbms_output.put_line('雇员名:'|| v_ename || '薪水' || v_sal);
end;
/
pl/sql块的实例(3)
包含定义部分,执行部分和例外处理部分
为了避免pl/sql程序的运行错误,提高pl/sql的健壮性,应该对可能的错误进行处理,这个很有必要。
1、比如在实例2中,如果输入了不存在的雇员号,应当做例外处理
2、有时出现异常,希望用另外的逻辑处理
我们看看如何完成1的要求
相关说明:Oracle事先预定义了一些例外,no_data_found就是找不到数据的例外
declare
v_ename varchar2(5); --定义字符串变量
v_sal number(7,2);
begin
select ename,sal into v_ename,v_sal from emp where empno=&no;
dbms_output.put_line('雇员名:'|| v_ename || '薪水' || v_sal);
exception
when no_data_found then
dbms_output.put_line('朋友,你的编号输入有误!');
end;
/
pl/sql分类
过程:过程适用于执行特定的操作,当建立过程时,既可以指定输入参数(in),
也可以指定输出参数(out),通过在过程中使用输入参数,可以将数据传递到
执行部分;通过使用输出参数,可以将执行部分的数据传递到应用环境。
在sqlplus中可以使用 create procedure 命令来建立过程。
实例如下:
1、请考虑编写一个过程,可以输入雇员名,新工资,可修改雇员的工资
2、如何调用过程有两种方法:
3、如何在Java程序中调用一个存储过程
--案例
create procedure sp_pro3(spName varchar2,newSal number) is
begin
--执行部分,根据用户名去修改工资
update emp set sal=newSal where ename=spName;
end;
/
--调用存储过程(exec。。。或者call。。)
exec sp_pro3('SCOTT',4678);
JAVA调用:
try{
//1、加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//2、得到连接
Connection ct = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ORCL", "scott", "scott");
//3、创建CallableStatement
CallableStatement cs = ct.prepareCall("{call sp_pro3(?,?)}");
//4、给?赋值
cs.setString(1, "SMITH");
cs.setInt(2, 10);
//5、执行
cs.execute();
//6、关闭
cs.close();
ct.close();
}catch(Exception e){
e.printStackTrace();
}
--那么PL/SQL究竟是什么
--1、理解oracle的PL/SQL概念
--2、掌握PL/SQL编程技术(包括编写过程、函数、触发器)
--PL/SQL(proecdural language/sql)是Oracle在标准的SQL语言上的扩展。
--PL/SQL不仅允许嵌入sql语言,还可以定义变量和常量,允许使用条件语句和
--循环语句,允许使用例外处理各种错误,这样使得它的功能变得更加强大。
--1、用PL/SQL这种语言来编写存储过程,函数,触发器
--2、这三者是在oracle中
--3、PL/SQL是非常强大的数据库过程语言
--4、过程,函数可以在Java程序中调用
--为什么要学PL/SQL呢?
--提高应用程序的运行性能(省略了Java程序传递到数据库后编译成数据库可识别代码的过程,Java程序可以直接调用过程)
--模块化的设计思想(将sql语句写成模块,把它写成一个个存储过程,然后直接调用存储过程,比如将分页写成存储过程,直接调用分页存储过程)
--比如说分页的过程:到时候直接传几个参数,传一个表名,传一个我要得到第几页,每一页显示几条的记录 ,一下就给你返回来了
----比如说订单的过程,转账的过程
--这样公司往往会将一些例如分页的这些需要很多代码的交给一个人去写成过程
--减少网络传输量
--提高安全性
--老师寄语
--传统的方法是用sql语句传给数据库,在真正的软件公司,它的数据库很有可能跟你调用的语句不在同一个机器上,那你肯定有一个网络传输的过程
--假设你这个sql语句很多,就很费时间,而如果将其统一到一个过程中,量一下子就减少了,减少的可不止是10几个字节,一天下来网络量就很大了。
--有时候甚至可以节约2,3G
--程序运行起来只是第一步,要让你的程序性能最优,那就体现了程序猿的价值了
--现在招聘的人他愿意招聘有经验的人,因为除了会做,还得最优
--别看都是笔记本名,IBM就是扎实,比神州笔记本结实很多
--所以,程序是有灵魂,一定要让你的东西做得好一点,其实编程不是我们想象的那样,
--年轻的,身体好的,他就一定怎么样,现在真正有经验的都是30岁,或者40岁的,像美国,
--上30多岁,40多岁的程序员很多,并不是国内所说的编程就是年轻人干的活,越小越好,
--一个程序员的成长是要有一个过程的,大家不要担心技术这个到了30岁,40岁过后就干不了活了
--不会那样子,现在招聘的要30岁以下的,招聘的档次就是比较低的,
--一般要招项目经理以上的,必须得30岁以上,美国,日本,你拿个名片出来说你是项目经理,
--那是因为他们觉得能到项目经理或者高级工程师,那是一个多高的职位啊,那就相当于很厉害了
--监狱长直到麦克是工程师,他马上就另眼相看了
--在国外要拿到工程师认证是很难的,如果你说你是项目经理,那就是很牛很牛的人了
--在国内变得不一样,去了就是工程师,干一年就是高级工程师
--其实我们做一样东西还是要有时间,慢慢慢慢才会成长的,把我们的程序做得有灵魂,那样的话你会看到技术另外一面的东西
--安全:过程把表名,字段名都封装到过程中去了,而你在调用的时候只是看到了存储过程的名字
--不好的地方:移植性不好,你把函数或者触发器写好了,如果你换了数据库,比如Oracle换db2,那你的存储过程全部要重写
--可是真正要遇到这种切换数据库很少
--用什么编写pl/sql
--sqlplus开发工具
--sqlplus是Oracle公司提供的一个工具,这个因为我们在以前介绍过的,
--举一个简单案例:
--编写一个存储过程,该过程可以向某表中添加记录
--pl/sql developer开发工具
--适用于开发pl/sql块的集成开发环境(ide),他是一个独立的产品,而不是Oracle的一个附带品
--举一个简单案例
--编写一个存储过程,该过程可以删除某表记录
--编写一个存储过程,该过程可以向某表中添加记录
--1、创建一个简单的表
--create table mytest(name varchar2(30),passwd varchar2(30));
--2、创建过程
--create or replace procedure sp_pro1 is
--begin
----执行部分
--insert into mytest values(‘aa’,‘dd’);
--end;
--/
--然后再换行即可
--如果有执行错误,如何查看错误信息?
--show error;
--如何调用该过程?
--1、exec 过程名(参数值1,参数值2,。。。)
--2、call 过程名(参数值1,参数值2,。。。)
--存储过程可以多次执行
create or replace procedure sp_pro2 is
begin
delete from student where name='hyd';
end;
exec sp_pro2;
--pl/sql基础
--开发人员使用pl/sql编写应用模块时,不仅需要掌握sql语句的编写方法,
--还要掌握pl/sql语句及语法规则。
--pl/sql编程可以使用变量和逻辑控制语句,从而可以编写非常有用的功能模块。
--比如:分页存储过程模块,订单处理存储过程模块,转账存储过程模块。。
--而且如果使用pl/sql编程,我们可以轻松的完成非常复杂的查询要求。
--pl/sql可以做什么
--简单分类
--块(编程)--过程(存储过程)
--函数
--触发器
--包
--编写规范
--注释
--单行注释,多行注释(/*........*/)
--标识符号的命名规范
--当定义变量时,建议用v_作为前缀 v_sal
--当定义常量时,建议用c_作为前缀 c_rate
--当定义游标时,建议用_cursor作为前缀 emp_cursor
--当定义例外时,建议用e_作为前缀 e_error
--pl/sql块介绍
--块(block)是pl/sql的基本程序单元,编写pl/sql程序实际上就是编写pl/sql块。
--要完成相对简单的应用功能,可能只需要编写一个pl/sql块;但是如果想实现复杂的功能,
--可能需要在一个pl/sql块中嵌套其他的pl/sql块。
--pl/sql块的结构
--pl/sql块由三部分构成:定义部分,执行部分,倒外处理部分。
如下所示:
declear
/*定义部分——定义常量,变量,游标,例外,复杂数据类型*/
begin
/*执行部分——要执行的pl/sql语句和sql语句*/
exception
/*例外处理部分——处理运行的各种错误*/
end;
--定义部分是从declear开始的,该部分是可选的
--执行部分是从begin开始的,该部分是必须的
--例外处理部分是从exception开始的,该部分是可选的
pl/sql块的实例
实例1--只包括执行部分的pl/sql块
set serveroutput on; --打开输出选项
begin
dbms_output.put_line('hello');
end;
--相关说明:
dbms_output是Oracle所提供的包(类似Java的开发包),该包包括一些过程,put_line就是dbms_output包的一个过程
--set serveroutput off; 关闭输出选项
--pl/sql块的实例2
declare
v_ename varchar2(5); --定义字符串变量
begin
select ename into v_ename from emp where empno=&no;
dbms_output.put_line('雇员名:'|| v_ename );
end;
/
--相关说明:
--& 表示要接收从控制台输入的变量
--把用户的工资也显示
declare
v_ename varchar2(5); --定义字符串变量
v_sal number(7,2);
begin
select ename,sal into v_ename,v_sal from emp where empno=&no;
dbms_output.put_line('雇员名:'|| v_ename || '薪水' || v_sal);
end;
/
pl/sql块的实例(3)
包含定义部分,执行部分和例外处理部分
为了避免pl/sql程序的运行错误,提高pl/sql的健壮性,应该对可能的错误进行处理,这个很有必要。
1、比如在实例2中,如果输入了不存在的雇员号,应当做例外处理
2、有时出现异常,希望用另外的逻辑处理
我们看看如何完成1的要求
相关说明:Oracle事先预定义了一些例外,no_data_found就是找不到数据的例外
declare
v_ename varchar2(5); --定义字符串变量
v_sal number(7,2);
begin
select ename,sal into v_ename,v_sal from emp where empno=&no;
dbms_output.put_line('雇员名:'|| v_ename || '薪水' || v_sal);
exception
when no_data_found then
dbms_output.put_line('朋友,你的编号输入有误!');
end;
/
pl/sql分类
过程:过程适用于执行特定的操作,当建立过程时,既可以指定输入参数(in),
也可以指定输出参数(out),通过在过程中使用输入参数,可以将数据传递到
执行部分;通过使用输出参数,可以将执行部分的数据传递到应用环境。
在sqlplus中可以使用 create procedure 命令来建立过程。
实例如下:
1、请考虑编写一个过程,可以输入雇员名,新工资,可修改雇员的工资
2、如何调用过程有两种方法:
3、如何在Java程序中调用一个存储过程
--案例
create procedure sp_pro3(spName varchar2,newSal number) is
begin
--执行部分,根据用户名去修改工资
update emp set sal=newSal where ename=spName;
end;
/
--调用存储过程(exec。。。或者call。。)
exec sp_pro3('SCOTT',4678);
JAVA调用:
try{
//1、加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//2、得到连接
Connection ct = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ORCL", "scott", "scott");
//3、创建CallableStatement
CallableStatement cs = ct.prepareCall("{call sp_pro3(?,?)}");
//4、给?赋值
cs.setString(1, "SMITH");
cs.setInt(2, 10);
//5、执行
cs.execute();
//6、关闭
cs.close();
ct.close();
}catch(Exception e){
e.printStackTrace();
}