`
lms168
  • 浏览: 61546 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

pl/sql进阶

 
阅读更多

------------------------分页----------------------------
create table book(
bookId number(3),
bookName varchar2(50),
publishHourse VARCHAR2(50)
);
--编写过程额
--in;表示这是一个输入参数,不写默认就是in
--out;表示一个输出参数
create or replace procedure sp_book(spBookId in number,spBookName in varchar2,spPublishHour varchar2) is
begin
insert into book values(spBookId,spBookName,spPublishHour);
end;

alter table book
add constraint uq_bookId unique(bookId);
--有输入和输出的存储过程
create or replace procedure sp_book1(spBookId in number,spBookName out varchar2) is
begin
select bookName  into spBookName from book where bookId=spBookId;
end;

--返回两个值的存储过程

 

 

 


create or replace procedure sp_book2(spBookId in number,spBookName out varchar2,spBookPublisher out varchar2) is
begin
select bookName,PUBLISHHOUR into spBookName,spBookPublisher from book where bookId=spBookId;
end;

----返回值的存储过程(列表[结果集])--
--编写一个过程,输入部门号,返回该部门所有雇员信息
--由于oracle存储过程没有返回值,他的所有返回值都是通过out
--参数来替代的,列表也不例外,但由于是集合,所以不能用一般的参数
--必须要用packageg了,所以要分两部分
--<1建一个包
create or replace package testpackage as
type test_cursor is ref cursor;
end testpackage;
--<2.创建过程
create or replace procedure  sp_pro9(spNo in number,p_cursor out testpackage.test_cursor) is
begin
open p_cursor  for select * from emp where deptno=spNo;
end;

 

 

 


-----if语句;if--then-----
create or replace procedure sp_pro6(spName varchar2) is
v_sal emp.sal%type;
begin
   select sal into v_sal from emp where ename=spName;
if v_sal<2000
then update emp set sal=sal*1.1 where ename=spName;
end if;    --不能掉了这里
end;


-------二重if语句-if--then--else---
create or replace procedure sp_pro6(spName varchar2) is
v_comm emp.comm%type;
begin
   select comm into v_comm from emp where ename=spName;
if(v_comm<>0)then
 update emp set comm=comm+100 where ename=spName;
else
update emp set comm=comm+200 where ename=spName;
end if;
end;

----------多重条件分支-if--then--elsif---else---
create or replace procedure sp_pro7(spEmpno number) is
v_job emp.job%type;
begin
select job into v_job from emp where empno=spEmpno;
if v_job='PRESIDENT'then
update emp set sal=sal+1000 where empno=spEmpno;
elsif v_job='MANAGER'then
update emp set sal=sal+500 where empno=spEmpno;
else
update emp set sal=sal+200 where empno=spEmpno;
end if;
end;

-----------循环语句loop 至少执行一回--相当与while-----
create table Users(
uno  number(3),
uname varchar2(10)
);

create or replace procedure sp_user(spUname varchar2) is
v_num Users.Uno%type:=1;
begin
loop
insert into Users values(v_num,spUname);
v_num:=v_num+1;
exit when v_num=11;     --退出时的判断语句
end loop;
end;

-------------while循环--先判断再循环---相当于do-while-------------
create or replace procedure sp_user(spUname varchar2) is
v_num Users.Uno%type:=11;
begin
while v_num<=20 loop
--执行
  insert into Users values(v_num,spUname);
   v_num:=v_num+1;
end loop;
end;


---------------for 循环-------------
create or replace procedure sp_user(spUname varchar2) is
begin
for i in  21..30 loop         --如果想从30到20反过来插入则在in后面加关键字 reverse
--执行
  insert into Users values(i,spUname);
end loop;
end;
---------------goto语句-------一般不常用-----------


---------------null语句---null语句不会执行任何操作,并且会直接将控制传递到下一条语句-,使用null语句主要是为了提高代码的可读性-----------------
create or replace procedure sp_pro6(spName varchar2) is
v_sal emp.sal%type;
begin
   select sal into v_sal from emp where ename=spName;
if v_sal<2000
then update emp set sal=sal*1.1 where ename=spName;
else
null;
end if;    --不能掉了这里
end;

 

 

------------------------分页----------------------------
create table book(
bookId number(3),
bookName varchar2(50),
publishHourse VARCHAR2(50)
);
--编写过程额
--in;表示这是一个输入参数,不写默认就是in
--out;表示一个输出参数
create or replace procedure sp_book(spBookId in number,spBookName in varchar2,spPublishHour varchar2) is
begin
insert into book values(spBookId,spBookName,spPublishHour);
end;

alter table book
add constraint uq_bookId unique(bookId);
--有输入和输出的存储过程
create or replace procedure sp_book1(spBookId in number,spBookName out varchar2) is
begin
select bookName  into spBookName from book where bookId=spBookId;
end;

--返回两个值的存储过程
create or replace procedure sp_book2(spBookId in number,spBookName out varchar2,spBookPublisher out varchar2) is
begin
select bookName,PUBLISHHOUR into spBookName,spBookPublisher from book where bookId=spBookId;
end;

----返回值的存储过程(列表[结果集])--
--编写一个过程,输入部门号,返回该部门所有雇员信息
--由于oracle存储过程没有返回值,他的所有返回值都是通过out
--参数来替代的,列表也不例外,但由于是集合,所以不能用一般的参数
--必须要用packageg了,所以要分两部分
--<1建一个包
create or replace package testpackage as
type test_cursor is ref cursor;
end testpackage;
--<2.创建过程
create or replace procedure  sp_pro9(spNo in number,p_cursor out testpackage.test_cursor) is
begin
open p_cursor  for select * from emp where deptno=spNo;
end;

 

--平常的分页代码
select * from emp;

select e.*,rownum rn from (select * from emp)e;

select e.*,rownum rn from (select * from emp)e where rownum<10;

select * from (select e.*,rownum rn from (select * from emp)e where rownum<10) where rn>6;

create or replace package fengyepackage as
type fengye_cursor is ref cursor;
end fengyepackage;

create or replace  procedure sp_fengye(pageNow in number,pageSise in number,tableName in varchar2,sortOrder in varchar2,pageCount out number,fengye_cursor out fengyepackage.fengye_cursor) is
v_rowCount number(2);  --总记录数目
v_pageCount number(2); --总页数
v_fromline number(2);
v_toline number(2);
v_sql  varchar2(1000);
begin
v_sql:='select count(*) from '||tableName;  --组织一个sql
execute immediate v_sql into v_rowCount;   --执行sql,并且把返回值赋给v_rowCount
if  mod(v_rowCount,pageSise)=0 then      --v_rowCount%pageSise=0的取余数的方式是错误的
v_pageCount:=v_rowCount/pageSise;
else
v_pageCount:=ceil(v_rowCount/pageSise);  --ceil相当于加了1
end if;
v_toline:=pageNow*pageSise;
v_fromline:=(pageNow-1)*pageSise;
pageCount:=v_pageCount;
v_sql:='select * from (select e.*,rownum rn from (select * from '||tableName||' '||sortOrder||')e where rownum<='||v_toline||') where rn>'||v_fromline;--两个连接符号之间要用空格隔开,否则java程序无法识别
open fengye_cursor for v_sql;
--close fengye_cursor;  --关闭游标,不能关闭否则java程序调用不到数据
--把游标的结果集传给JAVA的resultset之是不需要我们来手动的关闭游标的,因为JAVA把这个结果集接收过来的之后,如果JAVA对这个结果集操作完毕的话,JAVA会把这个结果集关闭掉的,不需要我们手动的去作任何操作!

end;


------游标测试
set serveroutput on;
declare
--定义游标类型sp_emp_cursor
type sp_emp_cursor is ref cursor;
--定义一个游标变量test_cursor
test_cursor sp_emp_cursor;
--定义变量
v_ename emp.ename%type;
v_sal emp.sal%type;
begin
--把teset_cursor和一个select结合
open test_cursor for select ename ,sal from emp where deptno=&no;
--循环取出
loop
    fetch test_cursor into v_ename,v_sal;
    exit when test_cursor%notfound;
    dbms_output.put_line('雇员姓名是:'||v_ename||'薪资是:'||v_sal);
end loop;   
close test_cursor;
end;

 

 

 

 

分享到:
评论

相关推荐

    pl/sql 学习资料

    在这个“PL/SQL学习资料”压缩包中,包含了十一个PDF文件,覆盖了从基础到进阶的广泛主题。下面我们将详细探讨这些知识点。 1. **PL/SQL基础知识**: - PL/SQL结构:了解块的概念,包括声明部分、执行部分和异常...

    Oracle PL/SQL programming(5th Edition)

    ### Oracle PL/SQL Programming知识点概览 #### 一、书籍基本信息 - **书名**:Oracle PL/SQL Programming(第五版) - **作者**:Steven Feuerstein 和 Bill Pribyl - **出版日期**:2009年10月1日 - **出版社**:...

    Oracle PL/SQL

    Oracle PL/SQL 学习指南 Oracle PL/SQL 是一种功能强大且灵活的编程语言,广泛应用于 Oracle 关系数据库管理系统中。本学习指南旨在帮助读者快速掌握 PL/SQL 的基础知识和高级技术。 PL/SQL 区块(BLOCK)的结构 ...

    PL/SQL 参考资料

    这个“PL/SQL参考资料”显然是一个针对初学者和进阶者的学习资源,旨在帮助读者逐步理解和掌握这一核心技术。 首先,我们要理解PL/SQL的基本结构。它由声明部分(Declarations)、执行部分(Executable section)和...

    sql and pl/sql

    ### SQL与PL/SQL知识点详解 #### 一、资料库基本概念 - **数据库管理系统(DBMS)**:Oracle数据库管理系统是一种关系型数据库管理系统(RDBMS),它使用SQL作为查询语言,支持多种数据类型、安全性特性以及事务...

    PL/SQL 教程 PPT

    PL/SQL,全称Procedural Language/...总的来说,PL/SQL教程PPT涵盖了从基础到进阶的多个方面,是学习和理解PL/SQL编程的良好资源。通过深入学习和实践,开发者可以有效地利用PL/SQL来管理和操作Oracle数据库。

    编程进阶性--PL/SQL

    ### 编程进阶性—PL/SQL #### 一、PL/SQL概述与基础知识 **1.1 什么是PL/SQL?** PL/SQL(Procedural Language for SQL)是一种专门为Oracle数据库设计的过程化语言,它结合了SQL的数据操纵能力和传统编程语言的...

    [Oracle Database 10g PL/SQL程序设计]源码

    这些源码涵盖了PL/SQL的各个核心概念,是初学者和进阶者宝贵的参考资料。在实践中,你可以尝试修改源码,观察其运行效果,从而增强对PL/SQL的掌握。同时,这些例子也可以作为日后项目开发中的参考,解决实际问题。

    PL/SQL程序设计教程

    本教程将深入探讨PL/SQL的各个方面,旨在帮助初学者和进阶者掌握这一关键技能。 在PL/SQL中,你可以编写存储过程、函数、触发器、游标和异常处理等高级数据库操作,这些都极大地增强了数据库应用的灵活性和效率。本...

    pl/sql用户指南与参考

    PL/SQL,全称Procedural ...这本书通过详细的讲解和实例,无疑能帮助读者从基础到进阶,全面掌握PL/SQL的使用。对于数据库开发者、DBA或者希望提升Oracle数据库应用开发能力的人来说,是一本不可多得的参考资料。

    pl/sql9.06及注册码

    而对进阶用户,了解如何利用PL/SQL Developer进行高效开发和数据库管理将非常有用。在使用过程中,注意定期更新软件以获取最新的补丁和功能,同时遵守软件许可协议,合法使用注册码,尊重知识产权。 总之,PL/SQL...

    《Oracle PL/SQL 实例精解》说明

    总的来说,《Oracle PL/SQL 实例精解》是一本实用的指南,旨在帮助读者从基础到进阶全面掌握Oracle数据库的PL/SQL编程技术,提升在数据库管理和开发领域的专业能力。通过阅读和实践书中的例子,读者不仅可以学习到...

    oracle 8i pl/sql秘籍

    《Oracle 8i PL/SQL 秘籍》是一本针对初学者极其有价值的指南,它为读者提供了深入理解Oracle数据库管理和PL/SQL编程的基础知识。Oracle是全球广泛使用的数据库管理系统之一,尤其是在大型企业和关键业务系统中。PL/...

    PL/SQL培训文档i

    Oracle Database 11g是Oracle Corporation发布的一个版本的数据库系统,它包含了对数据库管理系统的改进和新特性,其中PL/SQL是Oracle数据库中用于存储过程和函数的一种过程化语言。PL/SQL的培训文档通常涵盖了...

    Oracle PL/SQL的练习题

    这篇博客“Oracle PL/SQL的练习题”可能包含一系列针对初学者和进阶者的编程挑战,旨在提升对PL/SQL语言的理解和应用能力。虽然没有具体的描述,但我们可以推测这些练习可能涵盖以下几个方面: 1. **变量声明与赋值...

    PL/SQL Developer是一个集成开发环境,专门开发面向Oracle数据库的应用。

    PL/SQL Developer是一款专为Oracle数据库设计的集成开发环境(IDE),它提供了全面的功能,使得开发者可以高效地编写、测试和调试PL/SQL代码。PL/SQL是Oracle数据库中的过程化语言,它扩展了SQL,增加了流程控制、...

    PL/SQL文本文档

    这些知识点涵盖了PL/SQL的基础和进阶概念,是理解并使用PL/SQL进行数据库编程的关键。通过深入学习和实践,你可以创建高效、可靠的数据库应用程序。如果你对“PLSQL”标签下的笔记内容感兴趣,可以深入研究这两个...

    Oracle PLSQL 实例精解(第4版)完整版带目录

    《Oracle PLSQL 实例精解(第4版)》是一本深入探讨Oracle数据库中的PL/SQL编程语言的专业书籍。PL/SQL是Oracle数据库系统中用于处理数据的强大工具,它结合了SQL的查询能力与过程性编程语言的功能。本书旨在帮助读者...

    Oracle SQL PL/SQL 练习资料

    Oracle SQL和PL/SQL是数据库管理和开发中的核心技能,尤其对于那些希望在IT行业中从事数据库设计、开发或管理的人来说,掌握这些技术至关重要。本练习资料集合了丰富的学习资源,为初学者提供了扎实的基础,同时也...

Global site tag (gtag.js) - Google Analytics