/********************************************************************/
>pl/sql应用解析以及对应到在java中的调用方法
/********************************************************************/
0.
/********************************************************************/
>pl/sql介绍
//-----------------------------------------
//pl/sql是比t-sql更加高级的数据库过程语言。
//用于处理复杂的数据应用业务逻辑,
//能够减少在应用程序端的业务量,
//并且可以提高应用的性能和安全。
//-----------------------------------------
>pl/sql的组成部分
//-----------------------------------------
//pl/sql块
//procedure
//function
//package
//packagebody
//触发器
//-----------------------------------------
>最基本的pl/sql块
>带上变量声明的pl/sql块
//-----------------------------------------
//begin
// dbms_output.put_line("simple pl/sql block");
//end;
//======================
//declare
//v_ename emp.ename%type;
//begin
// select ename into v_ename from emp where emp.empno=7369;
// dbms_output.put_line('雇员名字:'||v_ename);
//end;
//-----------------------------------------
>存储过程
>如何调用存储过程
//-----------------------------------------
//没有输入和输出参数的存储过程
//create or replace procedure name_pro1
//is
//v_ename emp.ename%type;
//begin
// select ename into v_ename from emp where emp.empno=7369;
// dbms_output.put_line('雇员名字:'||v_ename);
//end;
//有输入和输出参数的存储过程
//create or replace procedure name_pro2
//(v_ename out varchar2,v_empno in number)
//is
//begin
// select ename into v_ename from emp where emp.empno=v_empno;
// dbms_output.put_line('雇员名字:'||v_ename);
//end;
//v_ename varchar2(50);//存储过程只能够在pl/sql块中执行不需要加exec/call但在java中调用的时候要加
//name_pro2(v_ename,7369);
//name_pro2(v_ename,7369);
//-----------------------------------------
>函数(函数可以有返回值和没有返回值如果有返回值就在函数的名字后面声明要返回的类型和接收返回值的变量)
>如何调用函数
//-----------------------------------------
//create or replace function name_fun1(v_empno number)
//return varchar2
//is v_ename varchar2(50);
//begin
// select ename into v_ename from emp where empno=v_empno;
// return v_ename;
//end;
//=====================
//v_ename varchar2(50);
//call name_fun1(7369) into:v_ename;
//如果在java中调用
//select name_fun1(7369) from dual;//这样
//rs.getInt(1);//得到返回值
//-----------------------------------------
>如何定义包
//-----------------------------------------
//包用于在逻辑上组合过程和函数,
//他由包规范和包体两部分组成
//包规范
//create package sp_package as
// procedure update_sal(v_ename varchar2,v_sal number);
// function sp_fun(v_ename varchar2) return number;
//end;
//包体
//create or replace package body sp_package as
// procedure update_sal(v_ename varchar2,v_sal number) is
// begin
// update emp set sal=v_sal where emp.ename=v_ename;
// end;
//
// function sp_fun(v_ename varchar2) return number is v_sal number(7,2)
// begin
// select sal*12+nvl(comm,0)*12 into v_sal
// from emp where ename=v_ename;
// return v_sal;//将返回值返回
// end;
//end;
//如何调用包中的函数或者过程
//call sp_package.update_sal('scott',1500);
//-----------------------------------------
/********************************************************************/
1.pl/sql中变量类型
/********************************************************************/
//标量类型(只能够接收一个值的变量)
//:=表示给变量或者常量赋值
v_ename varchar2(10):='张三';
v_count number(7,2);//表示有7个数字其中两位是属于小数
v_valid boolean not null default false;//如何附上默认值
c_radius constant number:=3.14;
//复合类型(处理不止一个值的变量)
//自定义行类型
//type emp_record_type is record(
//name emp.ename%type,
//salary emp.sal%type,
//);//自定义结构体类型相当于一个类
vr_emp emp_recored_type;//定义一个定义的行类型变量
//pl/sql数组
//相当于高级语言中的数组
//type sp_table_type is table of emp.ename%type
//index by binary_integer;
//定义这种类型的变量
//sp_table sp_table_type;
//如何使用
//select ename into sp_table(0) from emp where
//empno=7788;
//参数类型(游标)
//class classname 类型约束
//type 类型名称 is 类型约束;
//把一个游标和一个结果集结合
//open name_cursor for select * from emp;//把游标指向结果集
//循环游标
//loop
// fetch name_cursor into v_ename,v_sal;
// exit when name_cursor%notfound; --到notfound异常推出
// dbms_output.put_line(...);
//end loop;
/********************************************************************/
2.pl/sql中的条件结构
/********************************************************************/
//单重if
//if v_sal<2000 then
//update emp set sal=2000 where ename=v_ename;
//end if;//必须加end if否则错误
//基本语法形式
if--then--end if;
if--then--else--end if;,
if--then--elsif--else--end if;
/********************************************************************/
3.pl/sql中的循环
/********************************************************************/
//loop
// exit when 0==0;
//end loop;
//for 1..100
//loop
// exit when 0==0;
//end loop;
//while 1==0
//loop
// dbms_output.put_line('xxx');
//end loop;
/********************************************************************/
4.java如何调用存储过程以及对于各种返回和输入数据类型的处理
/********************************************************************/
//定义好游标类型
//create or replace package test_package as
//type test_cursor_type is ref cursor;
//end;
//创建存储过程并且返回游标
//create or replace procedure pro_testCursor(test_cusor out test_package.test_cursor_type)
//is begin
// open test_cusor for select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp;
//end;
//示例代码:
// public static void main(String[] args) {
// ResultSet rs=null;
// Connection conn=null;
// try {
// String username="scott";
// String pwd="root";
// String driver="oracle.jdbc.driver.OracleDriver";
// String url="jdbc:oracle:thin:@192.168.11.4:1521:orcl";
//
// Class.forName(driver);
// conn = DriverManager.getConnection(url, username, pwd);
//
// CallableStatement proc = conn.prepareCall("{call pro_testCursor(?)}");
// //将第一个参数注册为输出参数
// proc.registerOutParameter(1,OracleTypes.CURSOR);
// boolean success = proc.execute();
//
// //得到游标
// rs = (ResultSet)proc.getObject(1);
//
// while(rs.next()){
// Double empno = rs.getDouble("empno");
// String ename = rs.getString("ename");
// String job = rs.getString("job");
// Double mgr = rs.getDouble("mgr");
// Date hiredate = rs.getDate("hiredate");
// Double sal = rs.getDouble("sal");
// Double comm = rs.getDouble("comm");
// Double deptno = rs.getDouble("deptno");
// System.out.println(empno + "\t" + ename + "\t" + job + "\t"
// + mgr + "\t" + hiredate + "\t" + sal + "\t" + comm
// + "\t" + deptno + "\t");
// }
//
//
// } catch (Exception e) {
// e.printStackTrace();
// }finally{
// try {
// rs.close();
// conn.close();
// } catch (SQLException e) {
// e.printStackTrace();
// }
// }
// }
/********************************************************************/
oracle pl/sql应用解析以及存储过程对应到java中的调用方法
最新推荐文章于 2023-07-06 09:23:07 发布