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;