要求oracle pl-sql存储过程的输入输出参数为String[]或vector,请问在java和oracle pl-sql存储过程中调用语句、包头声明语句如何书写?

解决方案 »

  1.   

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

  2.   

    回复shizhenghai(石义海):
        你的上述代码意味着存储过程的in,out参数都是变长的,那么该存储过程如何定义呢?
      

  3.   

    如果我的包头这样写:
    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();
    %>