//创建包,在包中创建refcursor
CREATE OR REPLACE PACKAGE "TYPES"
AS[code=Java]
   TYPE refcursor IS REF CURSOR;
END;//创建存储过程
CREATE OR REPLACE PROCEDURE obtainpartnumberproc (
   leftobid   IN       VARCHAR2,
   rst        IN OUT   TYPES.refcursor
)
IS
   v_sqlstring   VARCHAR2 (1000);
BEGIN
   v_sqlstring :=
         'SELECT CLASS2,RIGHT,W2ISBORROWED FROM PDMM31A.ASSMSTRC WHERE LEFT='
      || leftobid;   OPEN rst FOR v_sqlstring;
END obtainpartnumberproc;
[/code]//在java中我是这样调用的CallableStatement cstmt = null ;
ResultSet rs = null ;
try{

string callSql = "{ call obtainpartnumberproc( ?,? )}";
//leftobid为一变量
                cstmt.setString( 1,leftobid);
cstmt.registerOutParameter( 2,oracle.jdbc.OracleTypes.CURSOR ) ;
cstmt.execute();
rs = ( ResultSet )cstmt.getObject( 2 );

}
可是cstmt.setString( 1,leftobid )报错,错误信息为:java.lang.NullPointerException
,请问朋友那里错了?如何在java中调用上面创建的存储过程?

解决方案 »

  1.   

    leftobid怎样赋值的?是null?
    随便改成个常量试试?
      

  2.   

    空指针异常,估计是你的对返回的结果集没有进行判断就直接去处理它.
    java程序对这个值rs 这个值先进行判断,如果不存在记录,则处理之.
      

  3.   

    贴子排版上有点问题重新发一篇://创建包,在包中创建refcursor
    CREATE OR REPLACE PACKAGE "TYPES"
    AS
      TYPE refcursor IS REF CURSOR; 
    END; //创建存储过程 
    CREATE OR REPLACE PROCEDURE obtainpartnumberproc ( 
      leftobid  IN      VARCHAR2, 
      rst        IN OUT  TYPES.refcursor 

    IS 
      v_sqlstring  VARCHAR2 (1000); 
    BEGIN 
      v_sqlstring := 
            'SELECT CLASS2,RIGHT,W2ISBORROWED FROM PDMM31A.ASSMSTRC WHERE LEFT=' 
          || leftobid;   OPEN rst FOR v_sqlstring; 
    END obtainpartnumberproc; //在java中我是这样调用的 
    CallableStatement cstmt = null ;
    ResultSet rs = null ;
    try{
        
            string callSql = "{ call obtainpartnumberproc( ?,? )}";
            //leftobid为一字符串变量
             cstmt.setString( 1,leftobid);
            cstmt.registerOutParameter( 2,oracle.jdbc.OracleTypes.CURSOR ) ;
            cstmt.execute();
            rs = ( ResultSet )cstmt.getObject( 2 );
            while (rs.next()) {
            ……
             }
        
    }可是cstmt.setString( 1,leftobid )报错,错误信息为:java.lang.NullPointerException ,
    不知道错在哪里……我想实现的功能是:将字符串变量传给obtainpartnumberproc存储过程,并且对查询的记录集进行其他的操作!
    朋友帮忙看看,我的代码写得有问题吗?
      

  4.   

    你的存贮过程应该没问题.
    这个值leftobid可能是空值,所以当你引用它的时候,报了空指针异常.
      

  5.   

    你这是java 问题,callstatement至少应该要创建,去找有关callstatement的例子,仔细看下。
      

  6.   

    应是缺少
    cstm = connection.prepareCall(callSql);