获得';无效的列索引';oracle中的错误
在oracle中,在以下代码中获取无效列错误。但是,当我单独执行分配给游标的查询时,它工作得很好。请让我知道我犯了什么错误:获得';无效的列索引';oracle中的错误,oracle,Oracle,在oracle中,在以下代码中获取无效列错误。但是,当我单独执行分配给游标的查询时,它工作得很好。请让我知道我犯了什么错误: CREATE OR REPLACE PROCEDURE etl_mergeEmployeeAttendee ( v_EmployeeNumber IN VARCHAR2 DEFAULT NULL , v_AttendeeName OUT NVARCHAR2, v_EmployeeAttendeeId OUT NUMBER, v_AttendeeTitle
CREATE OR REPLACE PROCEDURE etl_mergeEmployeeAttendee
(
v_EmployeeNumber IN VARCHAR2 DEFAULT NULL ,
v_AttendeeName OUT NVARCHAR2,
v_EmployeeAttendeeId OUT NUMBER,
v_AttendeeTitle OUT NVARCHAR2,
v_Company OUT NVARCHAR2,
v_Relationship OUT NVARCHAR2,
v_Operation OUT NUMBER,
v_Error OUT NUMBER
)
AS
v_Employee_AttendeeId NUMBER(10,0);
v_Employee_Id NUMBER(10,0);
v_Attendee_Name NVARCHAR2(50);
v_Attendee_Title NVARCHAR2(50);
v_Com_pany NVARCHAR2(50);
v_Relation_ship NVARCHAR2(50);
CURSOR sel_prod_attendee_csr
IS SELECT a.EmployeeAttendeeId ,
a.EmployeeId ,
a.AttendeeName ,
a.AttendeeTitle ,
a.Company ,
a.Relationship
FROM EmployeeAttendee a,
Employee b
WHERE b.EmployeeNumber = v_EmployeeNumber
AND a.EmployeeId = b.EmployeeId;
BEGIN
OPEN sel_prod_attendee_csr;
FETCH sel_prod_attendee_csr INTO
v_Employee_AttendeeId, v_Employee_Id,v_Attendee_Name,v_Attendee_Title,v_Com_pany,v_Relation_ship;
IF sel_prod_attendee_csr%FOUND= true THEN
/* found */
BEGIN
v_Operation := 1 ;
v_AttendeeTitle := v_Attendee_Title ;
v_Company := v_Com_pany ;
v_Relationship := v_Relation_ship ;
v_AttendeeName :=v_Attendee_Name;
END;
ELSE
v_Operation := 2 ;-- Insert
END IF;
CLOSE sel_prod_attendee_csr;
END;
您可以得到的最佳建议是:当您可以使用隐式游标时,不要使用显式游标。它们通常更快,需要更少的代码,更容易维护,并且您不太可能遇到这样的错误
将其改写为以下格式:
For sel_prod_attendee_csr in
select a.EmployeeAttendeeId ,
...
from ...
loop
etl_mergeEmployeeAttendee.EmployeeAttendeeId = a.EmployeeAttendeeId;
...
如您所见,您可以转储难看的“v_”前缀,并用过程名称命名变量的名称空间
如果只需要一行,则只需使用SQL语句:
select a.EmployeeAttendeeId ,
...
into etl_mergeEmployeeAttendee.EmployeeAttendeeId
from ...
考虑到过程的名称,我想您最好完全转储PL/SQL游标代码,只运行一条直接的SQL语句。“无效列索引”听起来像是JDBC错误。您是从Java调用这个过程吗?如果是这样,请与我们共享此代码,因为这很可能就是错误所在。这个过程本身似乎很好。您没有在数据集中循环,而是试图直接赋值。如果有多行,请尝试在其中循环。