为了提高访问的效率, 减少代码应分析, 我们需要把所有的SQL都用存储过程来写。其中有一条存储过程是这样的:create or replace procedure PROC_FETCH_PART_BOMCHECK(Model_Par in varchar2,
                                                     Xcvr_Par  in varchar2,
                                                     Part_result in out varchar2)
                                                   
                                                     
as
 --part_temp   varchar(50)  := '';
 attribute2_temp varchar2(25) := 'Y';
 Cursor cursor_part IS  select distinct part
    from bom_check
   where model = Model_Par
     and xcvr = Xcvr_Par
     and attribute2 = attribute2_temp;
begin 
  open cursor_part;
  loop
    begin
      fetch cursor_part into Part_result;
      exit when cursor_part%NOTFOUND;
    end;
  end loop;
  close cursor_part;
  
end ;
编译和test都pass了但在SQL面板中测试却报:输出参数不是绑定变量的错误。调用代码如下:
call PROC_FETCH_PART_BOMCHECK('SK3650A','SK3650A','KAHN4059A')
请高人指点一下这是什么原因啊?thanks in advance.

解决方案 »

  1.   

    输出参数不能是字符串,只能是变量.
    PROC_FETCH_PART_BOMCHECK('SK3650A','SK3650A','KAHN4059A'
      

  2.   

    Part_result in out varchar2为输出参数不可以为常量只能是变量;
    可以这样var v_str varchar2(100);
    exec :v_str:='KAHN4059A';
    exec PROC_FETCH_PART_BOMCHECK('SK3650A','SK3650A',:v_str) ;
      

  3.   

    Part_result in out varchar2把in out 拆开,用两个变量就行了嘛.
      

  4.   

    exec :v_str:='KAHN4059A'; 
    exec PROC_FETCH_PART_BOMCHECK('SK3650A','SK3650A',:v_str) ;是可行的为什么不更改Part_result in out varchar2 为Part_result in varchar2
    是不是程序要调用这个过程取PART_RESULT的值?
      

  5.   

    我在Java中测试了一下,具体代码如下:Connection con = DriverManager.getConnection(url, user,password);
    String str1 = "{call PROC_FETCH_PART_BOMCHECK(?,?,?)}";
    CallableStatement cstmt = con.prepareCall(str1);
    cstmt.setString(1, "SK3650A");
    cstmt.setString(2, "SK3650A");
    cstmt.setString(3, "");

    ResultSet rs =cstmt.executeQuery();
    if(rs != null){                                        rs.next(); System.out.println(rs.toString());
    System.out.println(rs.getString("Part_result")); System.out.println("result after");
    }
    结果是:222
    111
    oracle.jdbc.driver.OracleResultSetImpl@7259da
    java.sql.SQLException: ORA-00900: 无效 SQL 语句 at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:180)
    at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:208)
    at oracle.jdbc.ttc7.v8Odscrarr.receive(v8Odscrarr.java:192)
    at oracle.jdbc.ttc7.TTC7Protocol.describe(TTC7Protocol.java:592)
    at oracle.jdbc.driver.OracleStatement.describe(OracleStatement.java:5496)
    at oracle.jdbc.driver.OracleStatement.get_column_index(OracleStatement.java:5266)
    at oracle.jdbc.driver.OracleResultSetImpl.findColumn(OracleResultSetImpl.java:698)
    at oracle.jdbc.driver.OracleResultSet.getString(OracleResultSet.java:1505)
    at resource.Puyo.main(Puyo.java:39)

    说明它是在 System.out.println(rs.getString("Part_result")); 中出错的, 
      

  6.   

    感觉你Part_result 没有必要作为In参数啊out就可以了
      

  7.   


    这个是没有影响的。
    谁能告诉我上面Java代码报错的原因啊?
      

  8.   


    这个是没有影响的。
    谁能告诉我上面Java代码报错的原因啊?
      

  9.   


    这个是没有影响的。
    谁能告诉我上面Java代码报错的原因啊?
      

  10.   

    1、Part_result作为传输参数但是没有使用,那in就带来安全隐患;
    2、cursor给Part_result赋值只是取最后一条,这样取数太复杂了,效率有问题;
    3、调用方法
    cstmt.setString(1, "SK3650A");
    cstmt.setString(2, "SK3650A");
    cstmt.registerOutParameter(3, Types.VARCHAR);
    cstmt.execute();
    String testPrint = cstmt.getString(3);
      

  11.   


    谢谢,按你的建议改了下。 但是输出的结果是null, 返回去用sql直接查询了一下是有值的。
      

  12.   

    你改下存储过程,不要用cursor循环取,看看写死取一个存在的值还返回Null不,可能是有一条数据为null的