用户名:  密码:   
您当前的位置:首页 > SQL数据库 >  Oracle > 

第28讲 for循环,goto语句,null语句用法,创建无返回值,返回单个值多个值列表结果集的存储过程并在JAVA中调用它们的方法

上次修改时间: 2015-12-11 15:02:56      来源:网络总结      作者:钢铁长陈
上一页      路径:DSD\Learn\SQL数据库相关\Oracle数据库学习\韩顺平.玩转oracle教程笔记1_30讲\      下一页

for循环,goto语句,null语句用法,创建无返回值,返回单个值/多个值/列表结果集的存储过程并在JAVA中调用它们的方法

一、for循环 ,插入10次aaa到表users1中
begin
  for i in reverse 1..10 loop
  insert into users1 values(i,'aaa');
  end loop;
end;
/

二、goto语句,不建议使用,多层循环时才使用
declare
i int:=1;--定义i的类型为int,并赋初始值为1
begin
  loop
    dbms_output.put_line('输出i:'||i);
    if i=10 then
      goto end_loop;--会跳到<<end_loop>>位置
    end if;
    i:=i+1;
  end loop;
  --<<end_loop>>--或跳到这个
  dbms_output.put_line('结束');
  <<end_loop>>--跳到这里
  dbms_output.put_line('结束2');     
end;
/
注*:<<end_loop>>后必需要有一个输出语句dbms_output.put_line('结束2');  否则提示“出现符号 "END"在需要下列之一时”错误

三、null语句
不执行任何,直接将控制传递到下一条语句,主要为增加可读性

四、创建与在java中调用一个无返回值的过程
分页
下面编写一个过程,向book表添加数据
create table book(bookId number,bookName varchar2(50),publishHouse varchar2(50)); --先创建一个book表用于下面的演示
create or replace procedure sp_pro7  --创建一名为sp_pro7的过程
(spBookId in number,spBookName in varchar2,spPublishHouse in varchar2)is 
--给这个过程定义spBookId,spBookName,spPublishHouse三个参数 注:in表示这是一个输入参数,不写默认有个in,out表一个输出参数
begin
  insert into book values(spBookId,spBookName,spPublishHouse);
end;


在java中调用上面的过程sp_pro7
同以前一样建一个test2的java工程,再建一个com.sp包,建一test1的类文件,主函数勾上
//调用一个无返回值的过程
package com.sp;
import java.sql.*;
public class callpro7 {
 public static void main(String[] args) {
  try{
   Class.forName("oracle.jdbc.driver.OracleDriver"); //加载驱动,这里的Class的C必需大写
   Connection   ct=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:ORACLE1","scott","tiger");
                    CallableStatement cs=ct.prepareCall("{call sp_pro7(?,?,?)}");//创建CallableStatement
   cs.setInt(1,10);//给问号赋值
   cs.setString(2,"2222");
   cs.setString(3,"3333");
   cs.execute();//执行
   cs.close();//关闭各种资源
   ct.close();
  }catch (Exception e){
   e.printStackTrace();
  }  
 }
}
引jar包就可以运行了
select * from book;

五、创建与在JAVA中调用一个有返回值的存储过程
有输入和输出的存储过程
create or replace procedure sp_pro8
(spno in number,spName out varchar2) is
begin
select ename into spName from emp where empno=spno;
end;
/

在JAVA中调用上面有返回值的存储过程sp_pro8,
新建callpro8的java工程,工程中新建com.sp包,包中建callpro8类
package com.sp;
import java.sql.*;
public class callpro8 {
 public static void main(String[] args) {
  try{
   Class.forName("oracle.jdbc.driver.OracleDriver"); //Class的C必需大写
   Connection ct=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:ORACLE1","scott","tiger");
       CallableStatement cs=ct.prepareCall("{call sp_pro8(?,?)}");
   cs.setInt(1,7788);//给第一个问号赋值
   cs.registerOutParameter(2, oracle.jdbc.OracleTypes.VARCHAR);//取得第二个问号返回值,varchar表第二个问号返回的值的类型
   cs.execute();
                                      //取出返回值,要返回第2个问号,要注意问号的顺序
   String name=cs.getString(2);//String的S要大写,小写出氏
   System.out.println("7788 name is: "+name); //System的S也要大写,;println的l是L的小写
   cs.close();
   ct.close();
  }catch (Exception e){
   e.printStackTrace();
  }
 }
}

六、创建与调用一个返回多个值的存储过程
返回多个值
create or replace procedure sp_pro8
(spno in number,spName out varchar2,spSal out number,spJob out varchar2) is
begin
select ename,sal,job into spName,spsal,spJob from emp where empno=spno;
end;
/
调用有返回值的存储过程,代码在上面那个例子里修改
package com.sp;
import java.sql.*;
public class callpro8 {
 public static void main(String[] args) {
  try{
   Class.forName("oracle.jdbc.driver.OracleDriver"); //Class的C必需大写
   Connection ct=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:ORACLE1","scott","tiger");
       CallableStatement cs=ct.prepareCall("{call sp_pro8(?,?,?,?)}");
   cs.setInt(1,7788);//给第一个问号赋值
   cs.registerOutParameter(2, oracle.jdbc.OracleTypes.VARCHAR);//给第二个问号赋值,varchar是第2个问号返回的值的类型
   cs.registerOutParameter(3, oracle.jdbc.OracleTypes.DOUBLE); //DOUBLE为第3个反回值的类型
   cs.registerOutParameter(4, oracle.jdbc.OracleTypes.VARCHAR);//VARCHAR为第4个反回值的类型
   cs.execute();
   String name=cs.getString(2);//String的S要大写,小写出氏//取出第2个问号返回,要注意问号的顺序
   String job=cs.getString(4);
   System.out.println("7788 name is: "+name+". Work is: "+job); //System的S也要大写,;println的l是L的小写
   cs.close();
   ct.close();
  }catch (Exception e){
   e.printStackTrace();
  }
 }
}

七、创建与调用有返回结果列表集的存储过程
create or replace package tespackage as --先创建一个包,在该包中定义类型test_cursor是个游标
type test_cursor is ref cursor; --定义test_cursor为游标类型
end tespackage
/

创建存储过程
create or replace procedure sp_pro9
(spNo in number,p_cursor out tespackage.test_cursor) is --定义游标类型的方法:p_cursor out tespackage.test_cursor
begin
open p_cursor for select * from emp where deptno=spNo;
end;
/

在java中调用这个过程
package com.sp;
import java.sql.*;
public class callpro8 {
 public static void main(String[] args) {
  try{
   Class.forName("oracle.jdbc.driver.OracleDriver"); //Class的C必需大写
   Connection ct=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:ORACLE1","scott","tiger");
     CallableStatement cs=ct.prepareCall("{call sp_pro9(?,?)}");//创建CallableStatement
   cs.setInt(1,10); //10为部门编号
   cs.registerOutParameter(2,oracle.jdbc.OracleTypes.CURSOR);
   cs.execute();
   ResultSet rs=(ResultSet)cs.getObject(2);
   while(rs.next()){
    System.out.println(rs.getInt(1)+" "+rs.getString(2));//通过getObject得到结果集但类型不符,再通过ResultSet强行转换为结果集,“ ”这里的双引号为输出空格
   }
                                      rs.close();   
   cs.close();
   ct.close();
  }catch (Exception e){
   e.printStackTrace();
  }
 }
}