我正在研究一个基于IN参数自动执行某些插入操作的过程。我还想知道插入是否失败,所以我创建了一个异常,如果发生任何错误,该异常将返回“ FAIL”。我已经完成了该过程,并且我确定如果我只运行该过程,它将执行插入操作,但是我需要在另一个过程中使用该插入操作,因此,我需要能够访问插入状态。通常,我会在变量中选择*,但是由于我的过程中有插入,因此在查询中使用插入会出现错误。请帮助我找到一种方法来调用我的过程,以了解它们是否失败并采取相应措施。
这是一组数据样本和一个具有与我相似的功能的过程:
create table datatable(val1 INT, val2 INT, val3 INT);
create procedure insert_datatable(n in int, status out varchar2) is
status varchar2 := 'good';
begin
for i in 1.. n loop
insert into datatable(val1,val2,val3) values (1,2,n)
end loop
commit;
exception
when others then
rollback;
status := 'fail'
return status
end;
然后需要将上述proc调用到1.执行插入操作,并2.告诉我是否失败。我尝试了(没有成功):
select insert_datatable into insert_status from dual;
答案 0 :(得分:1)
首先,请更正明显的语法错误,例如缺少分号等。SO不是代码检查服务。请在此处张贴将编译的代码,以尊重那些自愿付出时间和精力的人们。谢谢。
第二,您尝试使用RETURN
语句返回一个值。过程不返回任何内容。
第三,您不能从查询中调用PROCEDURE。您需要将其设置为FUNCTION并使其返回值。
最后,不允许从查询中调用子例程中的事务控制语句(COMMIT,ROLLBACK)。我想您可以在函数中使用自主事务,但是坦率地说,我认为这是一个坏主意。最好的选择是从匿名PL / SQL块中调用过程:
DECLARE
intVar INT;
strStatus VARCHAR2(2000);
BEGIN
insert_datatable(n => intVar, status => strStatus);
END;
答案 1 :(得分:1)
您不需要在过程本地声明一个status
变量;其已经声明为OUT
参数。您还应该将COMMIT
和ROLLBACK
语句留给调用过程的块;这允许在一个事务中调用多个过程,然后可以全部提交它们或将它们全部回滚。您也不要在过程中使用RETURN
语句。
CREATE PROCEDURE insert_datatable(
n in int,
status out varchar2
)
IS
BEGIN
FOR i IN 1 .. n LOOP
insert into datatable(val1,val2,val3) values (1,2,n);
END LOOP;
status := 'good';
EXCEPTION
WHEN others THEN
status := 'fail';
END;
/
然后您可以使用PL / SQL调用它(您不能在查询中使用过程,为此需要一个函数):
DECLARE
p_status VARCHAR2(20);
BEGIN
insert_datatable(
n => 3,
status => p_status
);
DBMS_OUTPUT.PUT_LINE( p_status );
END;
/
哪个输出good
并将值放入表中
VAL1 | VAL2 | VAL3 ---: | ---: | ---: 1 | 2 | 3 1 | 2 | 3 1 | 2 | 3
db <>提琴here