补充一下上次博客的一些知识点:
for循环:(用的不多,作了解)
基本结构:
begin
for i in reverse 1...10 loop
insert into users values(i,'张三');
end loop;
end;
控制变量i,在隐含中就在不停的增加
oracle中pl/sql编程(四):
下面的案例所有的表都需要提前创建好
--案例:无返回值的存储过程
编写一个过程,可以向book表添加书,要求通过java程序调用该过程
create or replace procedure sp_pro9(spBookId in number,spBookName in varchar2,spPublisher in varchar2) is
begin
insert into book values(spBookId,spBookName,spPublisher);
end;
java程序:
package javastudy;
//无返回值的存储过程
import java.sql.*;
public class Testit1 {
public static void main(String[] args) {
try {
//加载驱动程序
Class.forName("oracle.jdbc.driver.OracleDriver");
//得到链接
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","scott","lh621366");
CallableStatement cs = conn.prepareCall("{call sp_pro10(?,?)}");//这里不支持exec这种调用模式
cs.setInt(1, 7788);
cs.registerOutParameter(2, oracle.jdbc.OracleTypes.VARCHAR);//这里的类型取决于上面第二个问号值的类型,暂时给第二个问号传递一个输出参数
//创建CallableStatement
CallableStatement cs = conn.prepareCall("{call sp_pro9(?,?,?)}");
//给?赋值
cs.setInt(1, 10);
cs.setString(2, "大卫");
cs.setString(3, "中华人民出版社");
//执行一下语句
cs.execute();
conn.close();
cs.close();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
--案例:有返回值的存储过程
编写一个过程,可以输入雇员的编号,返回该雇员的姓名
create or replace procedure sp_pro10(spno in number,spName out varchar2) is
begin
select ename into spName from emp where spno=empno;
end;
对应的java程序:
package javastudy;
//无返回值的存储过程
import java.sql.*;
public class Testit1 {
public static void main(String[] args) {
try {
//加载驱动程序
Class.forName("oracle.jdbc.driver.OracleDriver");
//得到链接
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","scott","lh621366");
CallableStatement cs = conn.prepareCall("{call sp_pro10(?,?)}");//这里不支持exec这种调用模式
cs.setInt(1, 7788);
cs.registerOutParameter(2, oracle.jdbc.OracleTypes.VARCHAR);//这里的类型取决于上面第二个问号值的类型,暂时给第二个问号传递一个输出参数
//执行一下语句
cs.execute();
//根据序号得到名字
String name = cs.getString(2);
//输出名字
System.out.println("7788序号所对应的名字为:"+name);
//关闭资源
conn.close();
cs.close();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
--案例:返回值为结果集的存储过程:
编写一个过程,输入部门号,返回该部门所有雇员信息
--分两步,先创建包,然后创建存储过程
--创建包
create or replace package testpackage as
type test_cursor is ref cursor;
end testpackage;
--再来创建存储过程
create or replace procedure sp_pro11(spno in number,sp_cursor out testpackage.test_cursor) is
begin
open sp_cursor for select * from emp where deptno=spno;
end;
对应的java程序:
package javastudy;
import java.sql.*;
public class Test2 {
public static void main(String[] args) {
try {
// 加载驱动程序
Class.forName("oracle.jdbc.driver.OracleDriver");
// 得到链接
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "scott", "lh621366");
CallableStatement cs = conn.prepareCall("{call sp_pro11(?,?)}");// 这里不支持exec这种调用模式
cs.setInt(1, 10);
cs.registerOutParameter(2, oracle.jdbc.OracleTypes.CURSOR);
cs.execute();
ResultSet rs = (ResultSet) cs.getObject(2);
while(rs.next())
{
System.out.println("用户名为:"+rs.getString(2));
}
conn.close();
cs.close();
} catch (Exception e) {
}
}
}
for循环:(用的不多,作了解)
基本结构:
begin
for i in reverse 1...10 loop
insert into users values(i,'张三');
end loop;
end;
控制变量i,在隐含中就在不停的增加
oracle中pl/sql编程(四):
下面的案例所有的表都需要提前创建好
--案例:无返回值的存储过程
编写一个过程,可以向book表添加书,要求通过java程序调用该过程
create or replace procedure sp_pro9(spBookId in number,spBookName in varchar2,spPublisher in varchar2) is
begin
insert into book values(spBookId,spBookName,spPublisher);
end;
java程序:
package javastudy;
//无返回值的存储过程
import java.sql.*;
public class Testit1 {
public static void main(String[] args) {
try {
//加载驱动程序
Class.forName("oracle.jdbc.driver.OracleDriver");
//得到链接
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","scott","lh621366");
CallableStatement cs = conn.prepareCall("{call sp_pro10(?,?)}");//这里不支持exec这种调用模式
cs.setInt(1, 7788);
cs.registerOutParameter(2, oracle.jdbc.OracleTypes.VARCHAR);//这里的类型取决于上面第二个问号值的类型,暂时给第二个问号传递一个输出参数
//创建CallableStatement
CallableStatement cs = conn.prepareCall("{call sp_pro9(?,?,?)}");
//给?赋值
cs.setInt(1, 10);
cs.setString(2, "大卫");
cs.setString(3, "中华人民出版社");
//执行一下语句
cs.execute();
conn.close();
cs.close();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
--案例:有返回值的存储过程
编写一个过程,可以输入雇员的编号,返回该雇员的姓名
create or replace procedure sp_pro10(spno in number,spName out varchar2) is
begin
select ename into spName from emp where spno=empno;
end;
对应的java程序:
package javastudy;
//无返回值的存储过程
import java.sql.*;
public class Testit1 {
public static void main(String[] args) {
try {
//加载驱动程序
Class.forName("oracle.jdbc.driver.OracleDriver");
//得到链接
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","scott","lh621366");
CallableStatement cs = conn.prepareCall("{call sp_pro10(?,?)}");//这里不支持exec这种调用模式
cs.setInt(1, 7788);
cs.registerOutParameter(2, oracle.jdbc.OracleTypes.VARCHAR);//这里的类型取决于上面第二个问号值的类型,暂时给第二个问号传递一个输出参数
//执行一下语句
cs.execute();
//根据序号得到名字
String name = cs.getString(2);
//输出名字
System.out.println("7788序号所对应的名字为:"+name);
//关闭资源
conn.close();
cs.close();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
--案例:返回值为结果集的存储过程:
编写一个过程,输入部门号,返回该部门所有雇员信息
--分两步,先创建包,然后创建存储过程
--创建包
create or replace package testpackage as
type test_cursor is ref cursor;
end testpackage;
--再来创建存储过程
create or replace procedure sp_pro11(spno in number,sp_cursor out testpackage.test_cursor) is
begin
open sp_cursor for select * from emp where deptno=spno;
end;
对应的java程序:
package javastudy;
import java.sql.*;
public class Test2 {
public static void main(String[] args) {
try {
// 加载驱动程序
Class.forName("oracle.jdbc.driver.OracleDriver");
// 得到链接
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "scott", "lh621366");
CallableStatement cs = conn.prepareCall("{call sp_pro11(?,?)}");// 这里不支持exec这种调用模式
cs.setInt(1, 10);
cs.registerOutParameter(2, oracle.jdbc.OracleTypes.CURSOR);
cs.execute();
ResultSet rs = (ResultSet) cs.getObject(2);
while(rs.next())
{
System.out.println("用户名为:"+rs.getString(2));
}
conn.close();
cs.close();
} catch (Exception e) {
}
}
}