forall i in 1..v_sum------------这里for i in 1..v_sum
for i in 1..num loop INSERT INTO B values (i); commit; end loop;
forall i in 1..v_sum这报异常了,改成:forall i in v_id.FIRST..v_id.LAST
for i in 1..10 LOOP /*操作*/ END LOOP 这种我知道,也没问题。 可是现在是用的forall ,看网上都这么写的。不知道为什么错了。还是网上的都写错了?不可能吧。 请问如果用forall怎么写?
改为 forall i in v_id.first..v_id.last还是错
应该是v_type, v_id的count 不一致导致的,假设v_type.count=5,v_id.count=3的话 那么你的insert 是有问题的,循环取v_id(4)时就有问题了楼主可以验证下是不是这个原因引起的,如果是的话 先申明记录类型的变量 type compare is record( name varchar2(30),--查询项名称, num number --数量 ); type cxjg_tab is table of compare index by binary_integer;-这样应该就不会出问题了
加上 DBMS_OUTPUT.put_line(v_id.count); DBMS_OUTPUT.put_line(v_type.count);输出结果:9 9 是一致的。 type compare is record( name varchar2(30),--查询项名称, num number --数量 ); type cxjg_tab is table of compare index by binary_integer;-申明记录类型的变量什么意思?
代码没有什么问题,oracle什么版本?
BANNER ---------------------------------------------------------------- Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - Prod PL/SQL Release 10.1.0.2.0 - Production CORE 10.1.0.2.0 Production TNS for 32-bit Windows: Version 10.1.0.2.0 - Production NLSRTL Version 10.1.0.2.0 - Production
create or replace procedure UPDATE_MERAREA is v_sum number; type t_type is table of A.MGRAREA%type; --这里定义的是字段 MGRAREA 类型 v_type t_type; type t_id is table of A.ID_OWNER%type; v_id t_id; begin SELECT mgrarea, id_owner BULK COLLECT INTO v_type, v_id FROM A where rownum < 10; v_sum:=v_id.count; forall i in 1..v_sum INSERT INTO B(ID_OWNER, owner_type) --这里要插入 owner_type 这个字段,类型不一样吧。 values (v_id(i), v_type(i)); exception when others then rollback; DBMS_OUTPUT.put_line(sqlerrm); end UPDATE_MERAREA;
--查查两个表的表结构,看是否是一至的。 --你可以试试改成下面的结果看看是否还报错 forall i in 1..v_sum dbms_output.put_line(v_id(i)); dbms_output.put_line(v_type(i));
--表达错了。意思就是让你打印一下结果看看 for i in 1..v_sum loop dbms_output.put_line(v_id(i)); dbms_output.put_line(v_type(i)); end loop;
把你的打印结果,以及表B的结构贴出来看看。DESC B;
B表结构 Name Type Nullable Default Comments ---------- ------------ -------- ------- -------- ID_OWNER VARCHAR2(32) MGRAREA VARCHAR2(30) Y 打印结果 130002414 4566321,896654331 130005457 1023543,78954654
--测试了一下,没发现什么问题,应该是数据和字段类型的原因 CREATE TABLE a( MGRAREA VARCHAR2(30), ID_OWNER VARCHAR2(30) ); CREATE TABLE b( ID_OWNER VARCHAR2(30), OWNER_TYPE VARCHAR2(30) );INSERT INTO a VALUES('123123','213123'); INSERT INTO a VALUES('12334','445345'); INSERT INTO a VALUES('123123','12323443'); INSERT INTO a VALUES('2342','4545'); INSERT INTO a VALUES('234234','213123');CREATE OR REPLACE PROCEDURE UPDATE_MERAREA IS V_SUM NUMBER; TYPE T_TYPE IS TABLE OF A.MGRAREA%TYPE; V_TYPE T_TYPE; TYPE T_ID IS TABLE OF A.ID_OWNER%TYPE; V_ID T_ID; BEGIN SELECT MGRAREA, ID_OWNER BULK COLLECT INTO V_TYPE, V_ID FROM A WHERE ROWNUM < 10; V_SUM := V_ID.COUNT; FORALL I IN 1 .. V_SUM INSERT INTO B (ID_OWNER, OWNER_TYPE) VALUES (V_ID(I), V_TYPE(I)); COMMIT; EXCEPTION WHEN OTHERS THEN ROLLBACK; DBMS_OUTPUT.PUT_LINE(SQLERRM); END UPDATE_MERAREA;
INSERT INTO B
values
(i);
commit;
end loop;
forall i in 1..v_sum这报异常了,改成:forall i in v_id.FIRST..v_id.LAST
for i in 1..10 LOOP
/*操作*/
END LOOP
这种我知道,也没问题。
可是现在是用的forall ,看网上都这么写的。不知道为什么错了。还是网上的都写错了?不可能吧。
请问如果用forall怎么写?
改为
forall i in v_id.first..v_id.last还是错
那么你的insert 是有问题的,循环取v_id(4)时就有问题了楼主可以验证下是不是这个原因引起的,如果是的话 先申明记录类型的变量
type compare is record(
name varchar2(30),--查询项名称,
num number --数量
);
type cxjg_tab is table of compare index by binary_integer;-这样应该就不会出问题了
加上
DBMS_OUTPUT.put_line(v_id.count);
DBMS_OUTPUT.put_line(v_type.count);输出结果:9
9
是一致的。
type compare is record(
name varchar2(30),--查询项名称,
num number --数量
);
type cxjg_tab is table of compare index by binary_integer;-申明记录类型的变量什么意思?
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - Prod
PL/SQL Release 10.1.0.2.0 - Production
CORE 10.1.0.2.0 Production
TNS for 32-bit Windows: Version 10.1.0.2.0 - Production
NLSRTL Version 10.1.0.2.0 - Production
create or replace procedure UPDATE_MERAREA is
v_sum number;
type t_type is table of A.MGRAREA%type; --这里定义的是字段 MGRAREA 类型
v_type t_type;
type t_id is table of A.ID_OWNER%type;
v_id t_id;
begin
SELECT mgrarea, id_owner BULK COLLECT
INTO v_type, v_id
FROM A
where rownum < 10;
v_sum:=v_id.count;
forall i in 1..v_sum
INSERT INTO B(ID_OWNER, owner_type) --这里要插入 owner_type 这个字段,类型不一样吧。
values
(v_id(i), v_type(i));
exception
when others then
rollback;
DBMS_OUTPUT.put_line(sqlerrm);
end UPDATE_MERAREA;
--查查两个表的表结构,看是否是一至的。
--你可以试试改成下面的结果看看是否还报错
forall i in 1..v_sum
dbms_output.put_line(v_id(i));
dbms_output.put_line(v_type(i));
for i in 1..v_sum loop
dbms_output.put_line(v_id(i));
dbms_output.put_line(v_type(i));
end loop;
B表结构
Name Type Nullable Default Comments
---------- ------------ -------- ------- --------
ID_OWNER VARCHAR2(32)
MGRAREA VARCHAR2(30) Y
打印结果
130002414
4566321,896654331
130005457
1023543,78954654
ID_OWNER和MGRAREA和B表中的这两个字段类型一样,都是vachar2,只是长度不一样。A表中ID_OWNER长度是50,mgrarea是10
--测试了一下,没发现什么问题,应该是数据和字段类型的原因
CREATE TABLE a(
MGRAREA VARCHAR2(30),
ID_OWNER VARCHAR2(30)
);
CREATE TABLE b(
ID_OWNER VARCHAR2(30),
OWNER_TYPE VARCHAR2(30)
);INSERT INTO a VALUES('123123','213123');
INSERT INTO a VALUES('12334','445345');
INSERT INTO a VALUES('123123','12323443');
INSERT INTO a VALUES('2342','4545');
INSERT INTO a VALUES('234234','213123');CREATE OR REPLACE PROCEDURE UPDATE_MERAREA IS
V_SUM NUMBER;
TYPE T_TYPE IS TABLE OF A.MGRAREA%TYPE;
V_TYPE T_TYPE;
TYPE T_ID IS TABLE OF A.ID_OWNER%TYPE;
V_ID T_ID;
BEGIN
SELECT MGRAREA, ID_OWNER BULK COLLECT
INTO V_TYPE, V_ID
FROM A
WHERE ROWNUM < 10;
V_SUM := V_ID.COUNT;
FORALL I IN 1 .. V_SUM
INSERT INTO B (ID_OWNER, OWNER_TYPE) VALUES (V_ID(I), V_TYPE(I));
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END UPDATE_MERAREA;
jym2002
还有所有参与的童鞋们。