oracle函数 isex,oracle之存储过程

oracle的版本为11g

存储过程实际上是属于子过程的一种特例,用于执行特定的操作

本文主要涉及到如下几个知识点:

1.创建一个不带参数的存储过程以及调用

2.创建一个带输入参数的存储过程以及调用

3.创建一个带输入输出参数的存储过程以及用java代码进行调用

4.创建一个带输入参数,输出返回一个结果集的存储过程以及用java代码调用

在执行所有的操作之前,创建一个用户,并创建一个表空间以及分配角色,并创建一张表

以下操作,都是以sys用户登录进行操作

创建一个表空间:

--创建一个表空间

--初始大小为50m 自动增长 每一次增长大小为50m 表空间最大为1024m 本地管理表空间

create tablespace under_data

datafile 'E:\app\undergrowth\oradata\under\under.dbf'

size 512m

autoextend on

next 50m maxsize 1024m

extent management local;

创建一个用户,指定默认表空间:

--创建一个用户,用户名和密码均为under_test 默认表空间为under_data

create user under_test identified by under_test

default tablespace under_data;

为用户授予角色:

--为用户授予角色

grant connect,resource to under_test;   这里可以查看一下connect,resource角色都有哪些权限

--查看角色有哪些权限

select * from dba_sys_privs where grantee='CONNECT';

db8d7f572a1613d1ba94092a8b9bdca1.png

CONNECT角色具有连接数据库的权限

select * from dba_sys_privs where grantee='RESOURCE';

cd4d9cbdddea30e1293438b2dc7eb4c2.png

RESOURCE角色具有创建表、序列、存储过程、触发器、视图等的权限

现在切换到under_test用户上

--切换用户

conn under_test/under_test;

2867da950ae540ca876fcfb9656f5519.png

在under_test用户下,创建一个表

--创建表

create table under_test

(

uname varchar2(20),

usex varchar2(4),

uage number(3,0),

ubirthday date

);

插入数据

--插入数据

insert into under_test values('undergrowth','男',22,to_date('1988-2-2','yyyy-mm-dd'));

insert into under_test values('刘德华','男',52,to_date('1961-2-2','yyyy-mm-dd'));

38c83a0b4db264610cdb851e186d34d6.png

到目前为止,准备工作完毕,开始存储过程的编写.

1.创建一个不带参数的存储过程以及调用

--创建不带参数的存储过程

--or replace 可以不要,加上的原因是当存储过程存在的话 就替换

create or replace procedure under_pro1

is

--声明部分,用于声明变量

--执行部分 从begin开始

begin

--在控制台输出信息 dbms_output为系统的一个预定义的包 put_line为包中的一个子过程

dbms_output.put_line('hello,存储过程');

end;

--用于执行创建

/

调用:

--调用

exec under_pro1;

但是会发现控制台没有信息输出 因为控制台的输出关掉了  使用 set serveroutput on;  打开控制台输出信息 即可看到hello,存储过程这一句话了

dd8604dc97fd3a77b7e92885f203f70f.png

2.创建一个带输入参数的存储过程以及调用

--创建带输入参数的存储过程

--or replace 可以不要,加上的原因是当存储过程存在的话 就替换

--iname in varchar2 指定输入参数为iname 数据类型为varchar2,in 关键字可以不要 默认就为in

create or replace procedure under_pro2(iname in varchar2)

is

--定义了一个变量 数据类型和under_test表的ubirthday字段的数据类型一致

v_birthday under_test.ubirthday%type;

begin

--根据输入的参数值 将iname的ubirthday赋值给v_birthday变量

select ubirthday into v_birthday from under_test where uname=iname;

--文本信息用''括起 不能用"" ||的作用起到字符串的连接作用

dbms_output.put_line('姓名:' || iname || '生日:' || v_birthday);

end;

/

调用:

--调用

exec under_pro2('刘德华');

933de8a7855db8c164f252860cf64cfd.png

3.创建一个带输入输出参数的存储过程以及用java代码进行调用

--创建一个带输入输出参数的存储过程以及用java代码进行调用

create or replace procedure under_pro3(iname in varchar2,oage out number,obirthday out date)

is

begin

select uage,ubirthday into oage,obirthday from under_test where uname=iname;

end;

/

编写java代码 : JavaCallPro.java

package com.undergrowth;

import java.sql.CallableStatement;

import java.sql.Connection;

import java.sql.Date;

import java.sql.DriverManager;

import java.sql.SQLException;

public class JavaCallPro {

/**

* @param args

*

*/

private static String className="oracle.jdbc.driver.OracleDriver";

private static String url="jdbc:oracle:thin:@localhost:1521:under";

private static String user="under_test";

private static String password="under_test";

private static Connection con=null;

private static CallableStatement cs=null;

public static void main(String[] args) {

// TODO Auto-generated method stub

try{

//1.注册驱动

Class.forName(className);

//2.获取连接

con=DriverManager.getConnection(url, user, password);

//3.准备调用存储过程

cs=con.prepareCall("{call under_pro3(?,?,?)}");

cs.setString(1, "刘德华");

cs.registerOutParameter(2, oracle.jdbc.OracleTypes.INTEGER);

cs.registerOutParameter(3, oracle.jdbc.OracleTypes.DATE);

//4.执行

cs.execute();

//5.获取结果

Integer age=cs.getInt(2);

Date birthday=cs.getDate(3);

System.out.println("姓名:刘德华"+" 年龄:"+age+" 生日:"+birthday);

}catch(Exception e)

{

e.printStackTrace();

}finally{

//6.关闭资源

try {

if(cs!=null) cs.close();

if(con!=null) con.close();

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

不要忘记了添加ojdbc6.jar包

控制台输出:

姓名:刘德华 年龄:52 生日:1961-02-02

4.创建一个带输入参数,输出返回一个结果集的存储过程以及用java代码调用

--创建一个带输入参数,输出返回一个结果集的存储过程以及用java代码调用

--创建一个包 包中自定义了一个引用游标 用于返回结果集

create or replace package under_pac is

type under_cursor is ref cursor;

end;

/

create or replace procedure under_pro4(isex in varchar2,ocursor out under_pac.under_cursor)

is

begin

--打开游标 让游标指向select * from under_test where usex=isex的结果集

open ocursor for select * from under_test where usex=isex;

end;

/

java代码:

package com.undergrowth;

import java.sql.CallableStatement;

import java.sql.Connection;

import java.sql.Date;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.SQLException;

public class JavaCallPro {

/**

* @param args

*

*/

private static String className="oracle.jdbc.driver.OracleDriver";

private static String url="jdbc:oracle:thin:@localhost:1521:under";

private static String user="under_test";

private static String password="under_test";

private static Connection con=null;

private static CallableStatement cs=null;

public static void main(String[] args) {

// TODO Auto-generated method stub

try{

//1.注册驱动

Class.forName(className);

//2.获取连接

con=DriverManager.getConnection(url, user, password);

//3.准备调用存储过程

cs=con.prepareCall("{call under_pro4(?,?)}");

/*cs.setString(1, "刘德华");

cs.registerOutParameter(2, oracle.jdbc.OracleTypes.INTEGER);

cs.registerOutParameter(3, oracle.jdbc.OracleTypes.DATE);*/

cs.setString(1, "男");

cs.registerOutParameter(2, oracle.jdbc.OracleTypes.CURSOR);

//4.执行

cs.execute();

//5.获取结果

ResultSet rs=(ResultSet) cs.getObject(2);

while(rs.next())

{

System.out.println("姓名:"+rs.getString(1)+"\t性别:"+rs.getString(2)+"\t年龄:"+rs.getInt(3)+"\t生日:"+rs.getDate(4));

}

}catch(Exception e)

{

e.printStackTrace();

}finally{

//6.关闭资源

try {

if(cs!=null) cs.close();

if(con!=null) con.close();

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

控制台输出:

姓名:undergrowth性别:男年龄:22生日:1988-02-02

姓名:刘德华性别:男年龄:52生日:1961-02-02

以上即是4种存储过程的使用情况,记录学习的脚步!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值