

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();
}
}
}