本想用sql执行的,无奈报错只好用游标把值硬插入,算是笨方法了。
CREATE OR REPLACE PROCEDURE testcursor
is
yhjerror EXCEPTION;
myresult INT;
BEGIN
declare
--类型定义
cursor c_job
is
SELECT COM_ID,
BAR_CODE,
ITEM_CODE,
COLOR_CODE,
SIZEID,
SUPBAR_CODE,
ORI_BARCODE,
GB_BARCODE,
OTHER_BARCODE
FROM YHJ_BARCODES;
--定义一个游标变量v_cinfo c_emp%ROWTYPE ,该类型为游标c_emp中的一行数据类型
c_row c_job%rowtype;
begin
for c_row in c_job
loop
INSERT
INTO BARCODES
(
COM_ID,
BAR_CODE,
ITEM_CODE,
COLOR_CODE,
SIZEID,
SUPBAR_CODE,
ORI_BARCODE,
GB_BARCODE,
OTHER_BARCODE
)
VALUES
(
c_row.COM_ID,
c_row.BAR_CODE,
c_row.ITEM_CODE,
c_row.COLOR_CODE,
c_row.SIZEID,
c_row.SUPBAR_CODE,
c_row.ORI_BARCODE,
c_row.GB_BARCODE,
c_row.OTHER_BARCODE
)
;
myresult:=SQL%ROWCOUNT;
IF ((myresult<>1) OR (myresult=0)) THEN
BEGIN
RAISE yhjerror;
end;
END IF ;
end loop;
end;
EXCEPTION
WHEN yhjerror THEN
BEGIN
null;
END;
END testcursor;
--COM_ID, BAR_CODE, ITEM_CODE, COLOR_CODE, SIZEID, SUPBAR_CODE, ORI_BARCODE, GB_BARCODE, OTHER_BARCODE
5 个解决方案
#1
在loop里面定义异常,捕获到异常以后使用go to 继续下次循环,我没试过,不过应该可行,你可以试一下
#2
CREATE OR REPLACE PROCEDURE testcursor
is
yhjerror EXCEPTION;
myresult INT;
BEGIN
myresult:=1;
declare loopresult INT;
declare
--类型定义
cursor c_job
...
loopresult:=SQL%ROWCOUNT;
IF ((loopresult<>1) OR (loopresult=0)) THEN
BEGIN
loopresult:=myresult;
end;
END IF ;
end loop;
IF ((myresult<>1) OR (myresult=0)) THEN
BEGIN
RAISE yhjerror;
end;
END IF ;
end;
EXCEPTION
...
#3
没理解。
错误是你自己抛出来的,既然不想中断循环,就不要在循环中抛错误啊。
错误是你自己抛出来的,既然不想中断循环,就不要在循环中抛错误啊。
CREATE OR REPLACE PROCEDURE testcursor
is
yhjerror EXCEPTION;
myresult INT;
BEGIN
myresult:=1;
declare loopresult INT;
declare
--类型定义
cursor c_job
...
loopresult:=SQL%ROWCOUNT;
IF ((loopresult<>1) OR (loopresult=0)) THEN
BEGIN
myresult:=loopresult;
end;
END IF ;
end loop;
IF ((myresult<>1) OR (myresult=0)) THEN
BEGIN
RAISE yhjerror;
end;
END IF ;
end;
EXCEPTION
...
#4
把begin exception end写在loop里面,形如
for x in (...) loop
begin
insert into .........;
exception
when others then
dbms_output.put_line(sqlerrm);
end;
end loop;
就可以了
for x in (...) loop
begin
insert into .........;
exception
when others then
dbms_output.put_line(sqlerrm);
end;
end loop;
就可以了
#5
begin
exception
end
是比较常用的方法。 建议 LZ 多多考虑一下业务。
exception
end
是比较常用的方法。 建议 LZ 多多考虑一下业务。
#1
在loop里面定义异常,捕获到异常以后使用go to 继续下次循环,我没试过,不过应该可行,你可以试一下
#2
CREATE OR REPLACE PROCEDURE testcursor
is
yhjerror EXCEPTION;
myresult INT;
BEGIN
myresult:=1;
declare loopresult INT;
declare
--类型定义
cursor c_job
...
loopresult:=SQL%ROWCOUNT;
IF ((loopresult<>1) OR (loopresult=0)) THEN
BEGIN
loopresult:=myresult;
end;
END IF ;
end loop;
IF ((myresult<>1) OR (myresult=0)) THEN
BEGIN
RAISE yhjerror;
end;
END IF ;
end;
EXCEPTION
...
#3
没理解。
错误是你自己抛出来的,既然不想中断循环,就不要在循环中抛错误啊。
错误是你自己抛出来的,既然不想中断循环,就不要在循环中抛错误啊。
CREATE OR REPLACE PROCEDURE testcursor
is
yhjerror EXCEPTION;
myresult INT;
BEGIN
myresult:=1;
declare loopresult INT;
declare
--类型定义
cursor c_job
...
loopresult:=SQL%ROWCOUNT;
IF ((loopresult<>1) OR (loopresult=0)) THEN
BEGIN
myresult:=loopresult;
end;
END IF ;
end loop;
IF ((myresult<>1) OR (myresult=0)) THEN
BEGIN
RAISE yhjerror;
end;
END IF ;
end;
EXCEPTION
...
#4
把begin exception end写在loop里面,形如
for x in (...) loop
begin
insert into .........;
exception
when others then
dbms_output.put_line(sqlerrm);
end;
end loop;
就可以了
for x in (...) loop
begin
insert into .........;
exception
when others then
dbms_output.put_line(sqlerrm);
end;
end loop;
就可以了
#5
begin
exception
end
是比较常用的方法。 建议 LZ 多多考虑一下业务。
exception
end
是比较常用的方法。 建议 LZ 多多考虑一下业务。