【赛迪网-it技术报道】一:无返回值的存储过程
1、建立存储过程
create or replace procedure testa(para1 in varchar2,para2 in varchar2) as
begin
insert into t_test (i_id,i_name) values (para1, para2);
end testa;
2、相应的java程序
import java.sql.*;
import java.io.outputstream;
import java.io.writer;
import java.sql.preparedstatement;
import java.sql.resultset;
import oracle.jdbc.driver.*;
public class testprocedureone {
public testprocedureone() {
}
public static void main(string[] args ){
string driver = "oracle.jdbc.driver.oracledriver";
string strurl = "jdbc:oracle:thin:@192.168.10.216:1521:ctbu";
statement stmt = null;
resultset rs = null;
connection conn = null;
callablestatement cstmt = null;
try {
class.forname(driver);
conn = drivermanager.getconnection(strurl, "dbname", "password");
callablestatement proc = null;
proc = conn.preparecall("{ call dbname.testa(?,?) }");
proc.setstring(1, "100");
proc.setstring(2, "testone");
proc.execute();
}
catch (sqlexception ex2) {
ex2.printstacktrace();
}
catch (exception ex2) {
ex2.printstacktrace();
}
finally{
try {
if(rs != null){
rs.close();
if(stmt!=null){
stmt.close();
}
if(conn!=null){
conn.close();
}
}
}
catch (sqlexception ex1) {
}
}
}
}
二:有返回值的存储过程(非列表)
1、存储过程为
create or replace procedure testb(para1 in varchar2,para2 out varchar2) as
begin
select into para2 from testtb where i_id= para1;
end testb;
2、java代码
public class testproceduretwo {
public testproceduretwo() {
}
public static void main(string[] args ){
string driver = "oracle.jdbc.driver.oracledriver";
string strurl = "jdbc:oracle:thin:@192.168.10.216:1521:ctbu";
statement stmt = null;
resultset rs = null;
connection conn = null;
try {
class.forname(driver);
conn = drivermanager.getconnection(strurl, "dbname", "password");
callablestatement proc = null;
proc = conn.preparecall("{ call hyq.testb(?,?) }");
proc.setstring(1, "100");
proc.registeroutparameter(2, types.varchar);
proc.execute();
string testprint = proc.getstring(2);
system.out.println("=testprint=is="+testprint);
}
catch (sqlexception ex2) {
ex2.printstacktrace();
}
catch (exception ex2) {
ex2.printstacktrace();
}
finally{
try {
if(rs != null){
rs.close();
if(stmt!=null){
stmt.close();
}
if(conn!=null){
conn.close();
}
}
}
catch (sqlexception ex1) {
}
}
}
}
}
注意,这里的proc.getstring(2)中的数值2并非任意的,而是和存储过程中的out列对应的,如果out是在第一个位置,那就是proc.getstring(1),如果是第三个位置,就是proc.getstring(3),当然也可以同时有多个返回值,那就是再多加几个out参数了。
三:返回列表
由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage了.所以要分两部分。
1、在sql*plus中建一个程序包
create or replace package testpackage as
type test_cursor is ref cursor;
procedure testc(cur_ref out test_cursor);
end testpackage;
建立存储过程,存储过程为:
create or replace package body testpackage as
procedure testc(cur_ref out test_cursor) is
begin
open cur_ref for select * from t_test;
end testc;
end testpackage;
可以看到,它是把游标(可以理解为一个指针),作为一个out 参数来返回值的。
java程序如下:
import java.sql.*;
import java.io.outputstream;
import java.io.writer;
import java.sql.preparedstatement;
import java.sql.resultset;
import oracle.jdbc.driver.*;
public class testprocedureone {
public testprocedureone() {
}
public static void main(string[] args ){
string driver = "oracle.jdbc.driver.oracledriver";
string strurl = "jdbc:oracle:thin:@192.168.10.216:1521:ctbu";
statement stmt = null;
resultset rs = null;
connection conn = null;
callablestatement cstmt = null;
try {
class.forname(driver);
conn = drivermanager.getconnection(strurl,"databasename" "password");
callablestatement proc = null;
proc = conn.preparecall("{ call cqsb.testa(?,?) }");
proc.setstring(1, "100");
proc.setstring(2, "testone");
proc.execute();
}
catch (sqlexception ex2) {
ex2.printstacktrace();
}
catch (exception ex2) {
ex2.printstacktrace();
}
finally{
try {
if(rs != null){
rs.close();
if(stmt!=null){
stmt.close();
}
if(conn!=null){
conn.close();
}
}
}
catch (sqlexception ex1) {
}
}
}
}
特别注意:
1、在执行前一定要先把oracle的驱动包放到class路径里。
2、toad在我建立存储过程中搞了很多莫名的错误,多数是没有创建成功而不报错,
或者是创建有误而不提示,应当引起重视。所以最好还是在sql*plus玩这些。
3、在sql*plus中的换行是无效的,要换行的时候一定要空格结尾,特别是你直接复制代码的时候!
闽公网安备 35060202000074号