涉及到表的处理请参看原表结构与数据  Oracle建表插数据等等

判断是否是素数:

create or replace procedure isPrime(x number) as
flag number:=1;
begin
if x<2 then
dbms_output.put_line('not prime');
else
for i in 2..x
loop
if i*i>x then
goto here;
end if;
if mod(x,i)=0 then
flag:=0;
goto here;
end if;
end loop;
<<here>>
if flag=1 then
dbms_output.put_line('is prime');
else
dbms_output.put_line('not prime');
end if;
end if;
end;
/

--调用

call isPrime(10);
call isPrime(11);

创建一个存储过程,该过程可以向某表中添加记录

create table mytest(
name varchar2(30),
password varchar2(30)
);
create or replace procedure fj_pro1 is
begin
insert into mytest values('jack','');--执行部分
end;
/
--执行过程删除名称为jack对应的列
create or replace procedure fj_pro1 is
begin
delete from mytest where name='jack';--执行部分
end;
/

replace表示如果有相同的procedurename就替换,fj_pro1表示procedurename
查看错误信息:

show error;

如何调用该过程

call procedurename(参数值1,参数值2);

创建过程,根据雇员名修改工资

create or replace procedure fj_pro2(a1name varchar2,a1sal number) is
begin
update tb_Employee set sal=a1sal where ename=a1name;
end;
/
call fj_pro2('SCOTT',150);--这样SCOTT的工资就被修改成了150
select * from tb_Employee where ename='SCOTT';

编写一个过程,输入雇员名,工资低于2000的雇员工资增加10%

create or replace procedure fj_pro3(fjname varchar2) is
v_sal tb_Employee.sal%type;--定义
begin
select sal into v_sal from tb_Employee where ename=fjname;--执行
if v_sal<2000 then--判断
update tb_Employee set sal=sal*1.1 where ename=fjname;
end if;
end;
/
call fj_pro3('SCOTT');--调用
select * from tb_Employee where ename='SCOTT';

雇员如果补助为零则加200,如果不为零则加100

create or replace procedure fj_pro4(fjname varchar2) is
v_comm tb_Employee.comm%type;--定义
begin
select comm into v_comm from tb_Employee where ename=fjname;--执行
if v_comm<>0 then--判断
update tb_Employee set comm=comm+100 where ename=fjname;
else
update tb_Employee set comm=comm+200 where ename=fjname;
end if;
end;
/
call fj_pro4('SCOTT');--调用
select * from tb_Employee where ename='SCOTT';

三个条件分支 if-then-elsif-else

输入雇员雇员号,如果该雇员的职位是PRESIDENT就给他的工资增加1000,如果该雇员的职位是MANAGER就给他的工资增加500,其它职位的雇员工资增加200。

create or replace procedure fj_pro5(fjno number) is
v_job tb_Employee.job%type;--定义
begin
select job into v_job from tb_Employee where pk_Employee_ID=fjno;--执行
if v_job='PRESIDENT' then
update tb_Employee set sal=sal+1000 where pk_Employee_ID=fjno;
elsif v_job='MANAGER' then
update tb_Employee set sal=sal+500 where pk_Employee_ID=fjno;
else
update tb_Employee set sal=sal+200 where pk_Employee_ID=fjno;
end if;
end;
/
call fj_pro5(7788);--调用
select * from tb_Employee where ename='SCOTT';

以员工号为参数,修改该员工的工资,10号部门加150,20号加200,30号加250,其他加300

create or replace procedure updatesal(p_empno tb_Employee.pk_Employee_ID%type) as
v_deptno tb_Employee.deptno%type;
v_inc tb_Employee.sal%type;
begin
select deptno into v_deptno from tb_Employee where pk_Employee_ID=p_empno;
case v_deptno
when 10 then v_inc:=150;
when 20 then v_inc:=200;
when 30 then v_inc:=250;
else v_inc:=300;
end case;
update tb_Employee set sal=sal+v_inc where pk_Employee_ID=p_empno;
end;
/
call updatesal(7788);--调用
select * from tb_Employee where ename='SCOTT';

循环语句 loop

users表中,用户雇员号从1开始增加
create table users(
userno number,
db_user varchar2(40)
);
create or replace procedure fj_pro6(fjname varchar2) is
v_num number:=1;--定义:=表示赋值
begin
loop
insert into users values(v_num,fjname);
exit when v_num=10;--判断退出条件
v_num:=v_num+1;--自增
end loop;
end;
/
call fj_pro6('root1');--调用,这样表中会有10个db_user为root1的列
select * from users;

继续加上10个root1

create or replace procedure fj_pro7(fjname varchar2) is
v_num number:=11;--定义:=表示赋值
begin
while v_num<=20 loop
insert into users values(v_num,fjname);
v_num:=v_num+1;
end loop;
end;
/
call fj_pro7('root1');--调用
select * from users;

分页:

create table book(
bookid number,bookname varchar2(50),publishhouse varchar2(50)
);
--in:表示这是一个输入参数,默认是in
create or replace procedure fj_pro8(
fjbookid in number,
fjbookname in varchar2,
fjpublishhouse in varchar2
) is
begin
insert into book values(fjbookid,fjbookname,fjpublishhouse);
end;
/

在java中调用

OraclPro2.java

create or replace procedure fj_pro9(
fjno in number,
fjname out varchar2,
fjsal out number,
fjjob out varchar2
) is
begin
select ename,sal,job into fjname,fjsal,fjjob from tb_Employee where pk_Employee_ID=fjno;
end;
/

OraclPro3.java
返回结果集

创建一个包

create or replace package testpackage as
type test_cursor is ref cursor;
end testpackage;
/

建立存储过程

create or replace procedure fj_pro10(
fjno in number,
p_sursor out testpackage.test_cursor
) is
begin
open p_sursor for select * from tb_Employee where deptno=fjno;
end;
/

OraclPro4.java
分页

select t1.*,rownum rn from (select * from tb_Employee) t1;
select t1.*,rownum rn from (select * from tb_Employee) t1 where rownum<=5;
select * from (select t1.*,rownum rn from(select * from tb_Employee) t1 where rownum<=5) where rn>=2;

开始编写分页的过程

create or replace procedure fenye(
table_name in varchar2,
pagesize in number,--每页大小
pagenow in number,--当前页
myrows out number,--总记录数
mypagecount out number,--总页数
p_sursor out testpackage.test_cursor--返回的记录集
) is
v_sql varchar2(1000);--定义部分,定义一个sql语句
v_begin number:=(pagenow-1)*pagesize+1;
v_end number:=pagenow*pagesize;
begin
v_sql:='select * from (select t1.*,rownum rn from(select * from '||table_name||' order by sal) t1 where rownum<='||v_end||') where rn>='||v_begin;--执行部分
open p_sursor for v_sql;--把游标和sql语句关联起来
--计算 myrows和 mypagecount
v_sql:='select COUNT(*) from '||table_name;
--执行sql,并把返回的值,赋给 myrows
execute immediate v_sql into myrows;
--计算 mypagecount
if mod(myrows,pagesize)=0 then
mypagecount:=myrows/pagesize;
else
mypagecount:=myrows/pagesize+1;
end if;
close p_sursor;--关闭游标
end;
/

使用java测试
OraclePro5.java

例外处理

declare
v_ename tb_Employee.ename%type;--定义
begin
--
select ename into v_ename from tb_Employee where pk_Employee_ID=&no;
dbms_output.put_line('雇员名是:'||v_ename);
exception
when no_data_found then
dbms_output.put_line('雇员号输入有误');
end;
/

处理预定义例外

case_not_found
create or replace procedure fj_pro11(fjno number) is
v_sal tb_Employee.sal%type;
begin
select sal into v_sal from tb_Employee where pk_Employee_ID=fjno;
case
when v_sal<1000 then
update tb_Employee set sal=sal+100 where pk_Employee_ID=fjno;
when v_sal<2000 then
update tb_Employee set sal=sal+200 where pk_Employee_ID=fjno;
end case;
exception
when case_not_found then
dbms_output.put_line('case语句没有与'||v_sal||'相匹配的条件');
end;
/
call fj_pro11(7900);
create or replace procedure ex_test(
fjno number
) is
--定义一个例外
myex exception;
begin
update tb_Employee set sal=sal+1000 where pk_Employee_ID=fjno;--更新用户sal
-- sql%notfound这是表示没有 update
--raise myex;触发 myex
if sql%notfound then
raise myex;
end if;
exception
when myex then
dbms_output.put_line('没有更新任何用户');
end;
/
call ex_test(7788);--调用
call ex_test(1111);--没定义例外之前这样也是不会出错的

Oracle系列之存储过程的更多相关文章

  1. .Net程序员学用Oracle系列(7):视图、函数、存储过程、包

    1.视图 1.1.创建.删除及调用普通视图 1.2.高级视图介绍 2.函数 2.1.系统函数介绍 2.2.创建.删除及调用自定义函数 3.存储过程 3.1.创建.修改及删除存储过程 3.2.调用存储过 ...

  2. .Net程序员学用Oracle系列(6):表、字段、注释、约束、索引

    <.Net程序员学用Oracle系列:导航目录> 本文大纲 1.表 1.1.创建表 1.2.修改表 & 删除表 2.字段 2.1.添加字段 2.2.修改字段 & 删除字段 ...

  3. .Net程序员学用Oracle系列(7):视图、函数、过程、包

    <.Net程序员学用Oracle系列:导航目录> 本文大纲 1.视图 1.1.创建视图 2.函数 2.1.创建函数 2.2.调用函数 3.过程 3.1.创建过程 3.2.调用过程 4.包 ...

  4. .Net程序员学用Oracle系列(25):触发器详解

    1.触发器理论 1.1.触发器的应用场景 1.2.触发器的类型 1.3.DML 触发器的触发顺序 2.触发器实战 2.1.创建触发器 2.1.1.创建 DML 触发器 2.1.2.创建 DDL 触发器 ...

  5. .Net程序员学用Oracle系列(28):PLSQL 之SQL分类和动态SQL

    1.SQL 语句分类 1.1.分类方法及类型 1.2.数据定义语言 1.3.数据操纵语言 1.4.其它语句 2.动态 SQL 理论 2.1.动态 SQL 的用途 2.2.动态 SQL 的语法 2.3. ...

  6. .Net程序员学用Oracle系列(30):零碎补充、最后总结(The End)

    1.同义词 2.Flashback 技术 3.连接字符串的写法 4.转义字符 & 特殊运算符 5.文件类型 6.查看参数 & 修改参数 7.AWR 工具 8.学习方法 & 学习 ...

  7. .Net程序员学用Oracle系列(8):触发器、作业、序列、连接

    1.触发器 2.作业 2.1.作业调度功能和应用 2.2.通过 DBMS_JOB 来调度作业 3.序列 3.1.创建序列 3.2.使用序列 & 删除序列 4.连接 4.1.创建连接 4.2.使 ...

  8. 【转】Oracle系列导航目录

    .Net程序员学用Oracle系列(1):导航目录 .Net程序员学用Oracle系列(2):准备测试环境 .Net程序员学用Oracle系列(3):数据库编程规范 .Net程序员学用Oracle系列 ...

  9. 系列文章----.Net程序员学用Oracle系列

    .Net程序员学用Oracle系列(18):PLSQL Developer 攻略 .Net程序员学用Oracle系列(17):数据库管理工具(SQL Plus) .Net程序员学用Oracle系列(1 ...

随机推荐

  1. 基于微软EnterpriseLib的框架(一)

    1.框架模型无ORM,重点在数据库建模设计与UI框架设计上 2.多数据库支持(Enterprise Lib 默认仅支持SqlServer和Oracle,需自己扩展才能支持其他数据库,本文已扩展SQLi ...

  2. 简单jquery 鼠标悬停提示效果

    记得自己引入jq插件哦~~~ <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...

  3. away3d打包到IOS锯齿问题解决办法

    很多ios设备是高清屏,一个像素顶普通设备四个像素.从这点上也许可以入手解决. 先把<requestedDisplayResolution>high</requestedDispla ...

  4. text与button上下不对齐解决方法

    火狐可以对齐,但是IE8不行,加上浮动就可以了 .search_right input[type=button] { float:right; }

  5. js调用asp.net 后台属性值

    后台代码: public string title = "js调用后台属性值"; public void getContent() { return title; } 前台代码: ...

  6. compass(sass)+seajs+frozenui+frozenjs+svn主干分支

    1.compass框架 sass编译 1.compass create 项目名 2.cd目录,执行compass watch 2.frozen框架 js(frozen.js),css(global.c ...

  7. 如何把jar包放到本地maven仓库中

    以前开发过程中也碰到过maven项目中需要引用其它jar包的情况,当时由于对maven还不熟悉,所以使用了在本地搭建nexus或者手动添加jar包的方法,两者都不是很方便. 如今因为淘宝的工作需要,又 ...

  8. 支持阻塞操作和轮询操作的globalfifo设备驱动代码分析以及测试代码

    #include <linux/module.h> #include <linux/types.h> #include <linux/fs.h> #include ...

  9. 利用数据库链做DML操作时报ORA-02069: global_names parameter must be set to TRUE for this operation

    按照 http://space.itpub.net/195110/viewspace-711110 的说法顺利解决问题. 通过DBLink更新远程数据的时候,如果使用到本地的sequence.函数.过 ...

  10. ubuntu u盘安装

    参考博客:http://www.bjwilly.com/archives/325.html 1.下载光盘映像 目前可选12.04LTS(长期支持版本) http://www.ubuntu.org.cn ...