//创建包,在包中创建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( ?,? )}";
        cstmt = con.prepareCall(callSql); 
        //leftobid为一字符串变量
         cstmt.setString( 1,leftobid);
        cstmt.registerOutParameter( 2,oracle.jdbc.OracleTypes.CURSOR ) ;
        cstmt.execute();
        rs = ( ResultSet )cstmt.getObject( 2 );
        while (rs.next()) {
        ……
         }
    
}
执行时报下列错误:
java.sql.SQLException: ORA-00904: 无效列名
ORA-06512: 在"SYS.OBTAINPARTNUMBERPROC", line 12
ORA-06512: 在line 1 at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:289)

解决方案 »

  1.   

    提示无效列名,应该是你的SQL语句中的某个列写错了吧
      

  2.   

    我将sql语句改成这样还是报一样的错误
    v_sqlstring :='SELECT * FROM PDMM31A.ASSMSTRC WHERE LEFT='|| leftobid;
      

  3.   

    //创建包,在包中创建refcursor
    CREATE OR REPLACE PACKAGE TYPES
    AS
      TYPE refcursor IS REF CURSOR; PROCEDURE obtainpartnumberproc ( 
      leftobid  IN      VARCHAR2, 
      rst        IN OUT  TYPES.refcursor 
    ) ;
    END; 
    /
    create or replace package body TYPES
    //创建存储过程 
    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; 
    end;
      

  4.   

    修改一下:
    用这种方式写,直接调用包中的存储规程
    TYPES.obtainpartnumberproc CREATE OR REPLACE PACKAGE TYPES
    AS
      TYPE refcursor IS REF CURSOR; PROCEDURE obtainpartnumberproc ( 
      leftobid  IN      VARCHAR2, 
      rst        IN OUT  TYPES.refcursor 
    ) ;
    END; 
    /
    create or replace package body TYPESPROCEDURE obtainpartnumberproc ( 
      leftobid  IN      VARCHAR2, 
      rst        IN OUT  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; 
    end;
      

  5.   

    你有个LEFT的列名吗?把它用双引号括起来试试,这是个关键字呀
      

  6.   


    像这样创建包报错啊:
    错误:(S1979) Expecting:    ;   AS  AUTHID  IS
      

  7.   


    LEFT是PDMM31A.ASSMSTRC表中的一个列
      

  8.   

    LEFT是Oracle中的关键字,你不应该用它来做列名的,在SQL语句中把LEFT用双引号括起来,这样:
    'SELECT CLASS2,RIGHT,W2ISBORROWED FROM PDMM31A.ASSMSTRC WHERE "LEFT"=' || leftobid;
      

  9.   


    还是不行啊,还报一样的错误:

    ORA-00904: 无效列名
    ORA-06512    : 在"SYS.OBTAINPARTNUMBERPROC", line 11
    ORA-06512    : 在line 9
      

  10.   

    存储过程代码
    1、CREATE OR REPLACE PROCEDURE obtainpartnumberproc (
    2、   leftobid   IN       VARCHAR2,
    3、   rst        IN OUT   TYPES.refcursor
    4、)
    5、IS
    6、   v_sqlstring   VARCHAR2 (1000);
    7、BEGIN
    8、   v_sqlstring :='SELECT CLASS2,"RIGHT",W2ISBORROWED FROM PDMM31A.ASSMSTRC WHERE "LEFT"='  9、|| leftobid; 10、   OPEN rst FOR v_sqlstring;
    11、END obtainpartnumberproc;创建成功!
    编译时时报
    ORA-00904: 无效列名 
    ORA-06512    : 在"SYS.OBTAINPARTNUMBERPROC", line 11 
    ORA-06512    : 在line 9 
      

  11.   

    RIGHT,LEFT都是关键字
    'SELECT CLASS2,"RIGHT",W2ISBORROWED FROM PDMM31A.ASSMSTRC WHERE "LEFT"=' || leftobid;
      

  12.   

    CREATE OR REPLACE PACKAGE TYPES 
    is
      TYPE refcursor IS REF CURSOR; PROCEDURE obtainpartnumberproc ( 
      leftobid  IN      VARCHAR2, 
      rst        IN OUT  TYPES.refcursor 
    );
    END; 
    /
    create or replace package body TYPES isPROCEDURE obtainpartnumberproc ( 
      leftobid  IN      VARCHAR2, 
      rst        IN OUT  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; 
    end;
      

  13.   


    按你的写法,包创建成功,可是存储过程创建时报错:
    Warning: compiled but with compilation errors
      

  14.   


    CREATE OR REPLACE PACKAGE TYPES 
    is
      TYPE refcursor IS REF CURSOR; PROCEDURE obtainpartnumberproc ( 
      leftobid  IN      VARCHAR2, 
      rst        IN OUT  TYPES.refcursor 
    );
    END; 
    /
    create or replace package body TYPES isPROCEDURE 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; 
    end;
    这么写包和存储过程都可以正常创建了,可是编译是还是报相同的错误:
    ORA-00904: 无效列名
    ORA-06512    : 在"SYS.TYPES", line 15
    ORA-06512    : 在line 9
    14楼说的我也照做了,把RIGHT和LEFT 都加了双引号但还包相同的错误,即使我把SQL语句中的RIGHT和LEFT都换成表中别的字段也不行
      

  15.   

    SELECT CLASS2,RIGHT,W2ISBORROWED FROM PDMM31A.ASSMSTRC
    在sqlplus中直接运行可以吗?
      

  16.   

    TYPES.refcursor
    改成:
    refcursor
      

  17.   

    这个存储规程在oracle中执行是不回有问题的。就看你的
    SELECT CLASS2,RIGHT,W2ISBORROWED FROM PDMM31A.ASSMSTRC WHERE LEFT=''
    这个语句是否可以执行!!
      

  18.   

    TYPES.refcursor 改成: refcursor就编译不过去了,报错:Warning: compiled but with compilation errors
    SQL语句在sqlplus中执行正常,如下:
    SQL*Plus: Release 9.2.0.1.0 - Production on 星期二 1月 13 13:37:48 2009
    Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.连接到: 
    Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production
    JServer Release 8.1.7.0.0 - ProductionSQL> select /*+RULE*/ CLASS2,RIGHT,W2ISBORROWED from PDMM31A.ASSMSTRC where LEFT='sieczKcpdmtstpdmm3
    1a-bJ1';CLASS2
    ----------------------------------------
    RIGHT                                            W2
    ------------------------------------------------ --
    W2BStMtr
    siejgKhpdmtstpdmm31a-bLy                         -
    …………
      

  19.   

    哎,刚刚接触oracle不久,出现错误就直眼,唉,还得学啊!!
      

  20.   

     'SELECT CLASS2,RIGHT,W2ISBORROWED FROM PDMM31A.ASSMSTRC WHERE LEFT=''' 
          || leftobid || ''''; 
      

  21.   

    终于解决了,最后总结一下,其实我的存储过程写的是没错的,不过像6楼ygjdatou 朋友那样,定义包头和包体也是正确的。这段代码主要的错误原因就在于那句sql语句写的有问题,改成楼上写的那样就哦了,最终代码: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;谢谢参与本贴的所有朋友们,鉴于分数有限,就把分给ygjdatou 和 linzi两为朋友吧!再次谢谢以上所有楼层的所有朋友,谢谢你们!!