Java 在存储的过程游标返回上具有getstring(列名)的列名无效

Java 在存储的过程游标返回上具有getstring(列名)的列名无效,java,oracle,Java,Oracle,我有一个简单的存储过程: SELECT NVL(pnum,0) INTO emp_pnum FROM employee_pnum WHERE person_id = i_person_id AND pn_status_id = (SELECT pn_status_id FROM ems.pn_status WHERE pn_status_desc = 'Active'); SELECT NVL(pnum,0) INTO old_p

我有一个简单的存储过程:

SELECT NVL(pnum,0)
      INTO emp_pnum 
      FROM employee_pnum 
     WHERE person_id = i_person_id
       AND pn_status_id = (SELECT pn_status_id FROM ems.pn_status WHERE pn_status_desc = 'Active');

SELECT NVL(pnum,0)
      INTO old_pnum 
      FROM employee_pnum_history
     WHERE person_id = i_person_id    
       AND created_date = (SELECT MAX(created_date) FROM ems.employee_pnum_history WHERE person_id = i_person_id);

OPEN x_pnum_history
   FOR SELECT emp_pnum,old_pnum
         FROM dual;
因此,将返回游标
x\u pnum\u history
。我只想将结果集读入一个类,如下所示

EmployeePNum empPnum = new EmployeePNum();
empPnum.setCurrent_pnum(rs.getString("emp_pnum"));
empPnum.setOld_pnum(rs.getString("old_pnum"));
上面说

CallableStatementCallback; bad SQL grammar [{call EMS.EMS_PKG.GET_EMP_PNUM(?, ?, ?, ?)}];
nested exception is java.sql.SQLException: Invalid column name
我不确定这里到底出了什么问题……非常感谢您的帮助。

当您这样做时:

打开x\u pnum\u历史记录
选择emp_pnum、old_pnum
来自双重;
。。。您正在从PL/SQL块的作用域中选择值,但生成的列没有名称。您可以看到与此类似的内容(通过SQL Developer运行):

注意:列标题显示一个通用绑定标记,
:B1
。但如果我显式地为列指定别名,则会执行以下操作:

declare
  emp_pnum number;
begin
  emp_pnum := 1;
  open :rc for select emp_pnum as emp_pnum from dual;
end;
/

anonymous block completed

print rc

RC
---------------------------------------
EMP_PNUM                                
--------------------------------------- 
1                                       
因此,在您的情况下,您需要更改您的过程以包括别名:

OPEN x_pnum_history
   FOR SELECT emp_pnum as emp_pnum, old_pnum as old_pnum
         FROM dual;

当然,这假设您的驱动程序和版本可以处理命名参数。不过,我认为您可能仍然需要在
getString()
调用中使用大写名称。

如果在
getString()
调用中列名是大写的,是否有效?我很确定这是区分大小写的,但现在无法检查…我尝试将它们改为大写。同样的错误。异常是在“empPnum.setCurrent_pnum(rs.getString(“emp_pnum”))”中捕获的。“当我使用它时,它工作得很好”empPnum.setCurrent_pnum(rs.getString(0));“对不起,我的意思是“empPnum.setCurrent_pnum(rs.getString(1));”是有意义的。谢谢你,亚历克斯。我会尝试一下,让你知道。再次感谢。这很有效。我也用大写的名字。谢谢你的详细解释。
OPEN x_pnum_history
   FOR SELECT emp_pnum as emp_pnum, old_pnum as old_pnum
         FROM dual;