`

plsql学习

阅读更多

plsql(procedure language sql)结构化的sql语句。

1.块的概念:

是plsql最小执行单元,由declear,begin,exception,end几个部分组成。

DECLARE
--声明部分(主要声明变量,常量,游标等),这部分可以不要
BEGIN
--执行部分,这个不能缺失
EXCEPTION
--异常部分,这个部分是在前面执行时候出现异常在这个地方进行捕获,可以不要
END;

 例如:

declare
v_ename varchar2(10);
v_sal number(7,2);
begin
select ename,sal into v_ename,v_sal from emp where empno=&aa;
dbms_output.put_line(v_ename || '  ' || v_sal);
exception
when no_data_found then
dbms_output.put_line('wrong number!');
end;

 ----set serveroutput on打开pl/sql developer显示dbms_output.put_line输出出来的信息;

2.存储过程

组成部分:

create procedure procedure_name
is
--变量的声明
begin
--执行代码
end;

 例如:

create procedure po_pro2(spEmpno number,spSal number)
is
begin
update emp set sal=spSal where empno=spEmpno;
end;

 实例2:没有返回值的存储过程(通过存储过程像emp表中添加一条记录);

create procedure insert_pro(
spNo in number,
spName in varchar2,
spSal in number,
spJob in varchar2,
spDeptno in number)
is
begin
insert into emp(empno,ename,sal,job,deptno) values(spNo,spName,spSal,spJob,spDeptno); 
end;

 对应java调用:

Class.forName("oracle.jdbc.driver.OracleDriver");
			
			Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl", "scott", "a123");
			
			CallableStatement cs = conn.prepareCall("{call insert_pro(?,?,?,?,?)}");
			
			cs.setInt(1, 71);
			cs.setString(2, "mickey");
			cs.setInt(3, 1001);
			cs.setString(4, "CLECK");
			cs.setInt(5, 10);
			cs.execute();

 实例3:有返回值的存储过程(查询emp表empno为7788的用户的姓名,工资等)

create procedure getName_pro(
spNo in number,
spName out varchar2,
spSal out number
)
is
begin
select ename,sal into spName,spSal from emp where empno=spNo;
end;

 对应的java调用:

CallableStatement cs = conn.prepareCall("{call getName_pro(?,?,?)}");
			
			cs.setInt(1, 7788);
			cs.registerOutParameter(2, OracleTypes.VARCHAR);
			cs.registerOutParameter(3, OracleTypes.FLOAT);
			cs.execute();
			
			String name = cs.getString(2);
			Float sal = cs.getFloat(3);
			
			System.out.println("姓名:"+name+"工资:"+sal);

 第二种情况:返回一个结果集的存储过程的调用(查询emp表中某个部门所有用户的姓名及工资)

--创建一个包,用于存放结果集

create package pac_test1 as
type my_cursor is ref cursor;
end pac_test1;

 --创建存储过程

create procedure pro_test3(spNo in number,sp_cursor out pac_test1.my_cursor)
is
begin
    open sp_cursor for select * from emp where deptno=spNo;
end;

 --对应java中的调用:

CallableStatement cs = conn.prepareCall("{call pro_test3(?,?)}");
			cs.setInt(1, 20);
			cs.registerOutParameter(2, OracleTypes.CURSOR);
			
			cs.execute();
			
			ResultSet rs = (ResultSet)cs.getObject(2);
			while(rs.next()) {
				System.out.println(rs.getString("ename") + "--" +rs.getString("sal"));
			}

 实例4:存储过程书写一个简单的分页

--创建一个分页的包

create package fenye_pac as
type fenye_cursor is ref cursor;
end fenye_pac;

 --创建存储过程,本分页只是实现了将整张表进行分页获取满足条件的当前页的数据及展示总页数与总记录数

create or replace procedure pro_test4(
tableName in varchar2,   --表名
pageCount in number,     --每一页的记录数
currentPage in number,   --需要第几页的内容
totalCount out number,   --总记录数
totalPage out number,    --总页数
p_cursor out fenye_pac.fenye_cursor  --存放返回的结果集
)
is
v_sql varchar2(1000);
v_start number;
v_end number;
begin
--计算分页开始数值
v_start:=(currentPage-1)*pageCount;
--计算分页结束数值
v_end:=currentPage*pageCount;
v_sql:='select * from (select rownum r,e.* from '|| tableName ||' e where rownum<='|| v_end ||') where r>'|| v_start;
open p_cursor for v_sql;
--获取总记录数
v_sql:='select count(1) from '|| tableName;
execute immediate v_sql into totalCount;
--计算总页数
if mod(totalCount,pageCount) = 0 then
totalPage:=totalCount/pageCount;
else
totalPage:=totalCount/pageCount+1;
end if;
end;

 对应的java的调用方式:

CallableStatement cs = conn.prepareCall("{call pro_test4(?,?,?,?,?,?)}");
			cs.setString(1, "emp");
			cs.setInt(2, 5);
			cs.setInt(3, 2);
			cs.registerOutParameter(4, OracleTypes.INTEGER);
			cs.registerOutParameter(5, OracleTypes.INTEGER);
			cs.registerOutParameter(6, OracleTypes.CURSOR);
			
			cs.execute();
			int totalCount = cs.getInt(4);
			int totalPage = cs.getInt(5);
			ResultSet rs = (ResultSet)cs.getObject(6);
			System.out.println("总页数:"+totalPage+"--总记录数:"+totalCount);
			while(rs.next()) {
				System.out.println(rs.getString("ename") + "--" + rs.getString("sal"));
			}

 3.函数的创建:

实例1:计算某个员工一年的工资收入;

 

create or replace function fun_test1(spNo number)
return number is yearSal number(7,2);
begin
select sal*12 into yearSal from emp where empno=spNo;
return yearSal;
end;

在pl/sql中测试函数的方法:

var yearSal number;
call fun_test1(7788) into:yearSal;

 4.包:

包括:过程,函数,变量,常量,类型,异常,游标。

实例1:

--包的声明
create or replace package pac_test1 as
--常量的声明
c_pi number:=3;
--公共类型
type t_rec is record(m1 number,m2 varchar2(10));
--公共变量
v_rec t_rec;
--过程的声明
procedure select_name(spNo in number);
--函数的声明
function count_sal(spNo in number) return number;
end pac_test1;

 

--包体的实现
create or replace package body pac_test1 is
procedure select_name(spNo in number)
is
spName emp.ename%type;
begin
select ename into spName from emp where empno=spNo;
dbms_output.put_line(spName);
end;
function count_sal(spNo in number) return number is yearSal number(7,2);
begin
select sal*12 into yearSal from emp where empno=spNo;
return yearSal;
end;
end pac_test1;

 5.plsql类型:

plsql中比较常见的三种类型:标量类型,复合类型,参量类型

(1).标量类型:是一些比较简单的类型,比如number,varchar2,date等等。

            注意:在声明标量类型变量的时候,如果不确定该变量的具体类型,可以通过表中字段%type方式确定该类型

            例如:

DECLARE
     v_name emp.ename%type;
     v_sal number(7,2);
BEGIN
     select ename,sal into v_name,v_sal from emp where empno=&no;
END;

(2).复合类型:就是由几个标量类型组合在一起,比如表中某一行数据可以看成是一个复合类型,这个时候可以通过%rowtype方式确定类型

比如:

declare
v_row_emp emp%rowtype;
begin
select * into v_row_emp from emp where empno=7788;
dbms_output.put_line(v_row_emp.ename);
end;
自定义声明一个复合类型,比如在某种情况下不需要表中一行数据的所有类型的时候,就需要自己定义那些需要的类型了,具体如下:
declare
type my_type is record(v_name emp.ename%type,v_sal emp.sal%type);
v_row_emp my_type;
begin
select ename,sal into v_row_emp from emp where empno=7788;
dbms_output.put_line(v_row_emp.v_name);
end;
 (3).参量类型:如果获取到的数据的类型不单单是一行数据,而是多行数据的话,这个时候就需要参量类型了(游标cursor);
具体实例如下:
declare
cursor my_cursor
is select * from emp where deptno=10;
v_cursor my_cursor%rowtype;
begin
open my_cursor;
loop
fetch my_cursor into v_cursor;
exit when my_cursor%NOTFOUND;
dbms_output.put_line(v_cursor.ename);
end loop;
end;
 
分享到:
评论

相关推荐

    PLSQL学习资料 PLSQL学习资料 PLSQL学习资料

    PLSQL学习资料 PLSQL学习资料 PLSQL学习资料 PLSQL学习资料 PLSQL学习资料 PLSQL学习资料 PLSQL学习资料 PLSQL学习资料 PLSQL学习资料 PLSQL学习资料 PLSQL学习资料 PLSQL学习资料 PLSQL学习资料 PLSQL学习资料 ...

    一个很全的PLSQL学习资料

    本压缩包文件“一个很全的PLSQL学习资料”显然是一份丰富的学习资源,包含多种格式的文档,旨在帮助用户全面理解和掌握PLSQL。 首先,我们有plsql.doc,这可能是一个详细的PLSQL教程文档,涵盖了基础语法、数据类型...

    PLSQL学习笔记(1-7)

    本“PLSQL学习笔记”将逐步讲解这些概念,通过实例和练习帮助读者巩固理解,进一步提升在Oracle数据库开发中的技能。无论你是初学者还是有经验的开发者,这份笔记都能提供有价值的参考。通过深入学习和实践,你将...

    plsql学习好资料

    作为学习PLSQL学习的一些好资料。大家好好评价评价

    PLSQL学习基础课件PPT

    本PLSQL学习基础课件PPT旨在为初学者提供深入浅出的教程,帮助他们掌握这一强大的数据库编程工具。 首先,我们要了解PLSQL的基本结构,它由声明部分、执行部分和异常处理部分组成。声明部分包括变量、常量、游标、...

    PLSQL学习材料整合

    PLSQL培训(二) PLSQL培训(一) oracle系列培训教材(PL-SQL).doc PL SQL教程.pdf PLSQL基础.pdf plsql配置自动显示my object_陈慧兵.doc SQL21自学通.pdf SQL复制指南及参考.pdf SQL语句优化.doc SQL语言参考...

    PLSQL学习进阶PPT

    PLSQL学习进阶PPT,十分适合初学者学习

    Oracle9iSQL/PLSQL学习笔记

    Oracle9i SQL/PLSQL 学习笔记 自己照着书学习时候的笔记。TXT的,比较简单,希望对大家学习有帮助。 其中0 mysqlCmd.txt是我自学mysql时候的笔记,是有关于命令的。大家看看有帮助没有。 都比较精华和简单,适合...

    ORACLE_PLSQL学习总结(提高)

    ### ORACLE_PLSQL学习总结(提高) #### 一、PL/SQL 块中的操作限制 在PL/SQL块中可以执行的操作主要包括:SELECT、DML(如INSERT、UPDATE、DELETE)以及事务控制语句(如COMMIT、ROLLBACK、SAVEPOINT)。然而,...

    PLSQL学习经典例子

    "PLSQL学习经典例子"这个压缩包文件显然是为了帮助学习者通过实践来深入理解PLSQL的各种概念和用法。 1. **基础语法与结构** PLSQL由声明部分、执行部分和异常处理部分组成。声明部分定义变量、游标、常量等;执行...

    PLSQL学习基础资料

    本文将深入探讨"PLSQL学习基础资料"中的关键知识点,旨在为初学者提供一个全面的入门指南。 首先,让我们从"Oracle-SQL语言基础"开始。SQL(Structured Query Language)是用于查询、更新和管理关系数据库的标准...

    PLSQL 操作学习文档

    在“PLSQL Developer操作学习文档”中,你可以期待学习到以下关键知识点: 1. **PLSQL基础**:了解PLSQL的基本语法结构,包括声明变量、常量、游标、异常处理等。学习如何定义过程(PROCEDURE)、函数(FUNCTION)...

    oracle_plsql学习资料

    这个“oracle_plsql学习资料”压缩包包含了一个名为“oracle_plsql.pdf”的文件,可以作为学习Oracle PL/SQL的基础教程。 Oracle PL/SQL是Oracle数据库的核心组成部分,主要用于开发存储过程、函数、触发器等数据库...

    Oracle and PLSQL学习课件

    在"Oracle and PLSQL学习课件"中,我们可以预期涵盖以下几个核心知识点: 1. **Oracle数据库基础**:了解Oracle数据库的基本架构,包括表空间、数据文件、控制文件、重做日志、实例和数据库的区别等。学习如何安装...

    PLSQL学习笔记

    在本篇"PLSQL学习笔记"中,我们将深入探讨这一强大的数据库编程工具,主要涵盖以下几个核心知识点: 一、PL/SQL简介 1.1 什么是PL/SQL PL/SQL是Procedural Language/SQL的缩写,由Oracle公司开发,它扩展了SQL的...

    PLSQL 学习笔记

    【PLSQL学习笔记】 PLSQL(Procedural Language/Structured Query Language)是Oracle数据库系统中的一个强大编程语言,它结合了SQL的查询能力与过程式编程语言的特点,为数据库开发提供了丰富的功能。这篇学习笔记...

    很好的确PLSQL 学习资料

    很好的学习PLSQL学习的资料,不可不下

    plsql学习资源

    plsql学习资源 plsql.ncd

    PLSQL学习教程

    PLSQL学习教程,讲解了其使用的方法,是一份不可多得的好材料

    PLSQL学习资料

    ### PL/SQL学习资料:PL/SQL Developer 7.0用户指南详解 #### 一、引言 在数据库管理与编程领域,Oracle的PL/SQL(Procedure Language for SQL)是不可或缺的一部分,它允许开发者在Oracle数据库环境中编写过程化...

Global site tag (gtag.js) - Google Analytics