ORA-01007:变量未在选择列表中同时获取C2到标记2下面

我有甲骨文的PL/SQL程序:ORA-01007:变量未在选择列表中同时获取C2到标记2下面

TYPE Paycomp2 IS RECORD(

Row_Id VARCHAR2(15),

Created DATE,

Created_By VARCHAR2(15),

Last_Upd DATE,

Last_Upd_By VARCHAR2(15),

Modification_Num NUMBER(10),

Conflict_Id VARCHAR2(15),

Comp_Price NUMBER(10),

Access_Level VARCHAR2(30),

Comp_Name VARCHAR2(30),

Depends_On VARCHAR2(30),

Gold_Cat VARCHAR2(30),

Order_Type VARCHAR2(30),

Parent_Id VARCHAR2(15),

Price_Plan VARCHAR2(30),

TYPE VARCHAR2(30),

Check_Flag VARCHAR2(1),

PREPAID_INIT_PRICE number(10),

DB_LAST_UPD date,

DB_LAST_UPD_SRC varchar2(50),

Unit_Type varchar2(30),

M2M_CATEGORY varchar2(30));

TYPE Paycomp IS REF CURSOR;

C2 Paycomp;

Cursor2 Paycomp2;

当我做下面的操作

FETCH C2 INTO Cursor2; 

我得到这个错误:

ORA-01007:变量不在选择列表错误。

这段脚本曾经工作过。

如何解决此问题?

脚本

Vordertype := 'Migration Prepaid - Postpaid'; 

Curcomp_Sql := Curcomp_Sql || Vordertype || '''' || ' union all ' || '' || Curcomp2sql || '' ||

Vordertype || '''';

OPEN C2 FOR Curcomp_Sql;

Sadmin.Pkg_Spliter.Prcsplitchar(Ppaycompstr, ';', Arrcomplist);

Vtotalcompprc := 0;

Arrcount := Arrcomplist.Count;

BEGIN

Dbms_output.put_line('reached17');

LOOP

FETCH C2

INTO Cursor2;

Dbms_output.put_line('reached18');

EXIT WHEN C2%NOTFOUND;

-- Processing each entry from Array

Compfndflg := 0;

dbms_output.put_line('arrCount 0: reached');

FOR Counter IN 1 .. Arrcount

LOOP

Vstrcommand := Arrcomplist(Counter);

dbms_output.put_line('arrCount : reached');

Sadmin.Pkg_Spliter.Prcsplitchar(Vstrcommand, '?', Arrdisclist);

IF Arrdisclist.Count <> 0 THEN

dbms_output.put_line('arrCount : reached1');

-- Extracting the ? seperated values and putting them into variables

Vcompname := Arrdisclist(1);

--dbms_output.put_line(CURSOR2.comp_name||':- count -'||COUNTER||'--'||VCOMPNAME);

BEGIN

-- Added by Accenture

IF Vcompname IS NOT NULL THEN

--dbms_output.put_line(CURSOR2.comp_name||':- count -'||COUNTER||'--'||ARRDISCLIST(1)||'-'||ARRDISCLIST(2)||'-'||ARRDISCLIST(3));

SELECT COUNT(0)

INTO v_Count_Exist

FROM Siebel.Cx_Paycomp_Mtx a, Siebel.Cx_Paycomp_Mtx b

WHERE a.Row_Id = b.Parent_Id

AND a.Order_Type = Vordertype

AND b.Type = 'Payment Component'

AND b.Comp_Name = Vcompname;

IF (v_Count_Exist = 0) THEN

Err_Msg := 'Invalid Payment Component in String';

Result_Out := '74';

Errflg := 1;

--dbms_output.put_line('Counter 2' || counter);

--dbms_transaction.rollback;

RAISE Error_Out;

END IF;

END IF;

--dbms_output.put_line('Counter 3' || CURSOR2.comp_name);

IF Vcompname = Cursor2.Comp_Name

--and VCOMPNAME != '3'

THEN

Compfndflg := 1;

EXIT;

END IF;

END;

END IF;

END LOOP;

---DBMS_OUTPUT.PUT_LINE('VCOMPNAME, COMPFNDFLG'||VCOMPNAME||','||COMPFNDFLG);

--dbms_output.put_line('CURSOR2.comp_name :'||CURSOR2.comp_name||' - COMPFNDFLG :'||COMPFNDFLG);

IF Compfndflg != 1 THEN

IF Temp_Comp_String IS NULL THEN

Temp_Comp_String := Cursor2.Comp_Name || '?0?;';

---DBMS_OUTPUT.PUT_LINE('STRING 1'||TEMP_COMP_STRING);

ELSE

Temp_Comp_String := Temp_Comp_String || Cursor2.Comp_Name || '?0?;';

---DBMS_OUTPUT.PUT_LINE('STRING 2'||TEMP_COMP_STRING);

END IF;

--- END IF;

ELSE

IF Temp_Comp_String IS NULL THEN

Temp_Comp_String := Arrdisclist(1) || '?' || Arrdisclist(2) || '?' ||

Arrdisclist(3) || ';';

---DBMS_OUTPUT.PUT_LINE('STRING 3'||TEMP_COMP_STRING);

ELSE

Temp_Comp_String := Temp_Comp_String || Arrdisclist(1) || '?' || Arrdisclist(2) || '?' ||

Arrdisclist(3) || ';';

---DBMS_OUTPUT.PUT_LINE('STRING 4'||TEMP_COMP_STRING);

END IF;

-- end if;

--- END IF;

END IF;

END LOOP;

END;

Curcomp_Sql VARCHAR2(2000) := 'SELECT mtx2.*

FROM siebel.CX_PAYCOMP_MTX mtx1, siebel.CX_PAYCOMP_MTX mtx2

WHERE mtx2.parent_id = mtx1.row_id

AND mtx2.comp_name <> ''Security Deposit''

AND mtx2.TYPE = ''Payment Component''

AND mtx1.order_type = ''';

Curcomp2sql VARCHAR2(2000) := 'SELECT mtx2.*

FROM siebel.CX_PAYCOMP_MTX mtx1, siebel.CX_PAYCOMP_MTX mtx2

WHERE mtx2.parent_id = mtx1.row_id

AND mtx2.comp_name = ''Security Deposit''

AND mtx2.TYPE = ''Payment Component''

AND mtx2.depends_on = ''ACCESS LEVEL''

AND mtx1.order_type = ''';

回答:

的简化版本,你看到什么,有虚表,简单的匿名块:

create table t42 (id number, some_value varchar2(10)); 

declare

type t_rec is record(id number, some_value varchar2(10));

l_rec t_rec;

l_cur sys_refcursor;

begin

open l_cur for 'select * from t42';

fetch l_cur into l_rec;

close l_cur;

end;

/

PL/SQL procedure successfully completed.

为了让你看到我只需要到错误删除表的一列:

alter table t42 drop column some_value; 

,并再次运行完全相同的代码:

declare 

type t_rec is record(id number, some_value varchar2(10));

l_rec t_rec;

l_cur sys_refcursor;

begin

open l_cur for 'select * from t42';

fetch l_cur into l_rec;

close l_cur;

end;

/

ORA-01007: variable not in select list

ORA-06512: at line 10

在PL/SQL块中声明的记录类型中的字段列表不再匹配游标查询中的列类型。您正在读取的记录变量需要两列(在我的版本中,22位在您的),但查询只获取一个值。

可以(有些人会说应该)指定所有你明确选择列,但假设你实际上指的是所有这些以后,你会那么做了相当于:

open l_cur for 'select id, some_value from t42'; 

它仍然会在塔移出后出错,虽然有点更有益也许是:

ORA-00904: "SOME_VALUE": invalid identifier 

ORA-06512: at line 9

由于您目前打算从单一的表中获取所有列,你也可以使用了the %rowtype语法而不是您自己的记录类型:

declare 

l_rec t42%rowtype;

l_cur sys_refcursor;

begin

open l_cur for 'select * from t42';

fetch l_cur into l_rec;

close l_cur;

end;

/

哪个与这个简单的示例运行成功。你仍然有问题,但只要你指的是除去列,假设它仍然是记录的一部分:

declare 

l_rec t42%rowtype;

l_cur sys_refcursor;

begin

open l_cur for 'select * from t42';

fetch l_cur into l_rec;

dbms_output.put_line(l_rec.some_value);

close l_cur;

end;

/

ORA-06550: line 7, column 30:

PLS-00302: component 'SOME_VALUE' must be declared

ORA-06550: line 7, column 3:

PL/SQL: Statement ignored

(使用%rowtype会给你一些喘息的空间,如果有一列被加入,因为它会被忽略,除非你添加了代码来引用那个记录字段,但是你的代码会得到ORA-00932不一致的数据类型,而不是ORA-01007,所以看起来并不是什么发生在这里。)

如果你不是指任何地方的删除列/字段,那么你不应该选择它。将记录类型更改为仅包含实际需要的字段,并且只获取游标查询中的相应列。

如果你指的是删除的列/字段,那么你仍然被卡住 - 你会发现什么被删除,为什么,然后修复你的代码不参考它(如果这是有道理的) ,或者让这个改变恢复。

以上是 ORA-01007:变量未在选择列表中同时获取C2到标记2下面 的全部内容, 来源链接: utcz.com/qa/265285.html

回到顶部