如何调用带有插入和out参数的过程?

时间:2019-09-11 20:57:52

标签: sql oracle

我正在研究一个基于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;

2 个答案:

答案 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参数。您还应该将COMMITROLLBACK语句留给调用过程的块;这允许在一个事务中调用多个过程,然后可以全部提交它们或将它们全部回滚。您也不要在过程中使用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