Session s=this.getSessionFactory().openSession(); 
Connection   con=s.connection();       
String   procedure   = "{?=call  fcm(?)}";         
 CallableStatement cstmt;
try {
 cstmt = con.prepareCall(procedure);
 cstmt.setString(2,companyid);  
 cstmt.registerOutParameter(1,java.sql.Types.VARCHAR );//函数返回两个值
 cstmt.registerOutParameter(2,java.sql.Types.VARCHAR );
 boolean b=cstmt.execute();
 String retValue = cstmt.getString(1);
 String retvalue2=cstmt.getString(2);
} catch (SQLException e) {
 e.printStackTrace();
return null;}finally{s.close();}       执行总是报这样的错(数据库是SQL SERVER2000):
过程 'fcm'的请求失败,因为 'fcm' 是 函数 对象。
路过的朋友如果知道请解答一下,不胜感激!

解决方案 »

  1.   

    cstmt.setString(2,companyid); 为什么函数只有一个参数却设了参数2的值呢?
    能把函数帖出来看看吗?
      

  2.   

    /*获取当前结点的子集*/ALTER  Function fmt(@StrCompanyId varchar(50))
    Returns @CompanyTree Table (COMPANY_CODE varchar(50),COMPANY_NAME varchar(50))
    As
    Begin
    Insert @CompanyTree Select COMPANY_CODE,COMPANY_NAME From DC_SYS_COMPANY_INFO Where COMPANY_CODE = @StrCompanyId       /*获取本结点*/
    Insert @CompanyTree Select COMPANY_CODE,COMPANY_NAME From DC_SYS_COMPANY_INFO Where P_COMPANY_ID = @StrCompanyId         /*获取一级子结点*/
    While @@Rowcount > 0    /*获取一级一下的子结点*/
    Insert @CompanyTree Select A.COMPANY_CODE,A.COMPANY_NAME From DC_SYS_COMPANY_INFO A Inner Join @CompanyTree B On A. P_COMPANY_ID = B.COMPANY_CODE And A.COMPANY_CODE Not In (Select COMPANY_CODE From @CompanyTree)
    Return
    End不知道是不是JAVA中只能调用存储过程?
      

  3.   

    SQL server调用函数的时候要加函数的所有者吧,如:dbo.fmt()
      

  4.   

    加上还是错误...
    java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]过程 'fmt的请求失败,因为 'fmt'是 函数 对象。
      

  5.   

    因为 'fmt'是 函数 对象。
    一看这句话就知道,不是这样调用函数的或者是不能请求函数对像啊,你写一个存储过程,然后在存储过程里调用这个函数,Java里调用存储过程
      

  6.   

    已经解决了...
    由于我返回的是一个表,直接把它当普通表用就可以了.
    pstmt = con.prepareStatement("select * from fmt('"+companyid+"')");
    结贴