要执行服务器上的存储过程,往往要传递一些参数。这些参数分为四种类型:
第一种称为输入参数,由客户程序向存储过程传递值。
第二种称为输出参数,由存储过程向客户程序返回结果。
第三种称为输入/输出参数,既可以由客户程序向存储过程传递值,也可以由存储过程向客户程序返回结果。
第四种称为状态参数,由存储过程向客户程序返回错误信息。
要说明的是,并不是所有的服务器都支持上述四种类型的参数,例如,InterBase就不支持状态参数。
Oracle存储过程包含三部分:过程声明,过程主体,过程异常
一个简单例子描述了基本存储过程的基本用法。
create or replace procedure proc_test(
p_id in number,
p_info out varchar)
is
v_row users%rowtype;
cursor v_cur is select * from users;
begin
if p_id > 0 then
select * into v_row from users where id = p_id;
p_info := v_row.username||'='||v_row.name;
else
open v_cur;
loop
fetch v_cur into v_row;
exit when v_cur%notfound;
if p_info is null then
p_info := v_row.username||'='||v_row.name;
else
p_info := p_info||','||v_row.username||'='||v_row.name;
end if;
end loop;
close v_cur;
end if;
exception
when too_many_rows then
DBMS_OUTPUT.PUT_LINE('返回值多于1行');
when others then
DBMS_OUTPUT.PUT_LINE('在RUNBYPARMETERS过程中出错!');
end;
在PL/SQL中调用存储过程如下
-- Test statements here
declare
v_id number := 0;
v_info varchar2(4000);
begin
proc_test(v_id, v_info);
DBMS_OUTPUT.PUT_LINE(v_info);
end;
在JAVA中调用存储过程如下
package tf;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Types;
public class TestProc {
private static String sDriver = "oracle.jdbc.driver.OracleDriver";
private static String sUrl = "jdbc:oracle:thin:@tf:1521:orcl";
private static Connection conn;
private static CallableStatement cs;
public static void main(String[] args) {
try {
Class.forName(sDriver);
conn = DriverManager.getConnection(sUrl, "test", "123");
cs = conn.prepareCall("{ call proc_test(?,?) }");
cs.setInt(1, 0);
cs.registerOutParameter(2, Types.VARCHAR);
cs.execute();
String result = cs.getString(2);
System.out.println("返回结果为:" + result);
} catch (Exception e) {
e.printStackTrace();
}
}
}