java程序调用oracle pl-sql存储过程 要求oracle pl-sql存储过程的输入输出参数为String[]或vector,请问在java和oracle pl-sql存储过程中调用语句、包头声明语句如何书写? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 public static String[] execProc(String sProc, String[] saParam) { Connection con = null; CallableStatement call = null; String[] out=new String[0]; int inN=0;//输入参数个数 int outN=0;//输出参数个数 try{ StringTokenizer tok=new StringTokenizer(sProc,"?"); inN= tok.countTokens()-1; tok=new StringTokenizer(sProc,"^"); outN= tok.countTokens()-1; out=new String[outN]; if(outN>0) { char[] ca=sProc.toCharArray(); int caLength = ca.length; for(int j=0;j<caLength;j++) { if(ca[j]=='^') ca[j]='?'; } sProc=new String(ca); } /////////////////////////////////// con = DBConnectionManager.getConnection(); call = con.prepareCall(sProc); if(inN>0){ for(int i = 0;i<inN;i++){ call.setString(i+1,saParam[i]); } } if(outN>0){ for(int i=0;i<outN;i++){ call.registerOutParameter(inN+i+1,Types.VARCHAR) ; } } call.execute() ; if(outN>0){ for(int i=0 ;i<outN;i++){ out[i]=""+call.getString(inN+i+1) ; } Debug.println("sp input parameters:"); Debug.println(saParam); Debug.println("sp("+sProc+") return string[]:"); Debug.println(out); } } catch( Exception e ) { String errorInfo = "Error in DataBean:execProc("+sProc+")"; e.printStackTrace(); } finally { try { call.close(); } catch (Exception e) { e.printStackTrace(); } try { con.close(); } catch (Exception e) { e.printStackTrace(); } call = null; con = null; } return out; } 回复shizhenghai(石义海): 你的上述代码意味着存储过程的in,out参数都是变长的,那么该存储过程如何定义呢? 如果我的包头这样写:CREATE OR REPLACE PACKAGE pkg_test AS TYPE strTab IS TABLE OF varchar(500) INDEX BY BINARY_INTEGER; PROCEDURE prc_StatDataAll (in_strTab IN strTab, out_strTab OUT strTab); END pkg_test;/show error;那么在jsp中我的调用参数要这样写呢?下面是我为调试通过的代码,不知道错在哪,感觉是类型不匹配的问题?请高手出招吧。<%beanhome.Db db2=new beanhome.Db();String proName="PKG_test.prc_StatDataAll";Connection conn2=db2.getConn();conn2.setAutoCommit(true);CallableStatement cstmt2 = conn2.prepareCall("{ call " +proName+"(?,?)}");String[] inStrTab=new String[2];String[] outStrTab=new String[2];inStrTab[0]="in_1";inStrTab[1]="in_2";cstmt2.setArray(1,inStrTab);cstmt2.registerOutParameter(2,java.sql.Types.OTHER);cstmt2.execute();String[] outStrTab=new (String[])cstmt2.getObject(1);db2.release();%> 一个关于序列的问题 oracle sql 定义变量问题 oracle next_day函数 解答一个题 oracle执行计划疑问 问个简单的问题 ,我写了个过程a, 如何调用啊,call a ;不对啊 如何恢复触发器? 急!关于sql问题! 数据查询 求一个数据恢复的函数 about autotrace question 有什么方法能让实例视图实时刷新?
{ Connection con = null;
CallableStatement call = null;
String[] out=new String[0];
int inN=0;//输入参数个数
int outN=0;//输出参数个数
try{
StringTokenizer tok=new StringTokenizer(sProc,"?");
inN= tok.countTokens()-1;
tok=new StringTokenizer(sProc,"^");
outN= tok.countTokens()-1;
out=new String[outN];
if(outN>0)
{
char[] ca=sProc.toCharArray();
int caLength = ca.length;
for(int j=0;j<caLength;j++)
{
if(ca[j]=='^')
ca[j]='?';
}
sProc=new String(ca);
}
///////////////////////////////////
con = DBConnectionManager.getConnection();
call = con.prepareCall(sProc);
if(inN>0){
for(int i = 0;i<inN;i++){
call.setString(i+1,saParam[i]);
}
}
if(outN>0){
for(int i=0;i<outN;i++){
call.registerOutParameter(inN+i+1,Types.VARCHAR) ;
}
}
call.execute() ;
if(outN>0){
for(int i=0 ;i<outN;i++){
out[i]=""+call.getString(inN+i+1) ;
}
Debug.println("sp input parameters:");
Debug.println(saParam);
Debug.println("sp("+sProc+") return string[]:");
Debug.println(out);
}
}
catch( Exception e ) {
String errorInfo = "Error in DataBean:execProc("+sProc+")";
e.printStackTrace();
}
finally {
try { call.close(); }
catch (Exception e) { e.printStackTrace(); }
try { con.close(); }
catch (Exception e) { e.printStackTrace(); }
call = null;
con = null;
}
return out;
}
你的上述代码意味着存储过程的in,out参数都是变长的,那么该存储过程如何定义呢?
CREATE OR REPLACE PACKAGE pkg_test AS TYPE strTab IS TABLE OF varchar(500) INDEX BY BINARY_INTEGER;
PROCEDURE prc_StatDataAll (in_strTab IN strTab,
out_strTab OUT strTab); END pkg_test;
/
show error;
那么在jsp中我的调用参数要这样写呢?下面是我为调试通过的代码,不知道错在哪,感觉是类型不匹配的问题?请高手出招吧。
<%
beanhome.Db db2=new beanhome.Db();
String proName="PKG_test.prc_StatDataAll";
Connection conn2=db2.getConn();
conn2.setAutoCommit(true);
CallableStatement cstmt2 = conn2.prepareCall("{ call " +proName+"(?,?)}");
String[] inStrTab=new String[2];
String[] outStrTab=new String[2];
inStrTab[0]="in_1";
inStrTab[1]="in_2";
cstmt2.setArray(1,inStrTab);
cstmt2.registerOutParameter(2,java.sql.Types.OTHER);
cstmt2.execute();
String[] outStrTab=new (String[])cstmt2.getObject(1);
db2.release();
%>