Sql 如何使用INSERT和out参数调用过程?
我正在研究一个基于IN参数自动执行某些插入的过程。我还想知道插入是否失败,所以我创建了一个异常,如果发生任何错误,它将返回“失败”。我已经完成了这个过程,如果我只是运行这个过程,我确信它会执行插入操作,但是我需要在另一个过程中使用它,因此我需要能够访问插入的状态。通常我会选择*into变量,但因为我的过程中有INSERT,所以在查询中使用INSERT时会出现错误。请帮助我找到一种方法来调用我的过程,以了解它们是否失败,并相应地采取行动 以下是一组数据样本和一个程序样本,其功能与我的类似:Sql 如何使用INSERT和out参数调用过程?,sql,oracle,Sql,Oracle,我正在研究一个基于IN参数自动执行某些插入的过程。我还想知道插入是否失败,所以我创建了一个异常,如果发生任何错误,它将返回“失败”。我已经完成了这个过程,如果我只是运行这个过程,我确信它会执行插入操作,但是我需要在另一个过程中使用它,因此我需要能够访问插入的状态。通常我会选择*into变量,但因为我的过程中有INSERT,所以在查询中使用INSERT时会出现错误。请帮助我找到一种方法来调用我的过程,以了解它们是否失败,并相应地采取行动 以下是一组数据样本和一个程序样本,其功能与我的类似: 创建
创建表datatable(val1 INT、val2 INT、val3 INT);
创建过程insert_datatable(n in int,status out varchar2)为
状态varchar2:=“良好”;
开始
因为我在1。。n环
插入数据表(val1,val2,val3)值(1,2,n)
端环
犯罪
例外
当其他人
回降;
状态:=“失败”
返回状态
结束;
然后需要将上述过程调用到1。执行插入和2。告诉我他们是否失败了。我试过(没有成功):
从dual中选择insert_datatable进入insert_状态;
首先,请纠正明显的语法错误,如缺少分号等。因此,这不是代码检查服务。请尊重那些在这里自愿付出时间和努力的人,他们将在这里发布编译代码。谢谢
其次,您尝试使用return
语句返回一个值。程序不返回任何内容
第三,不能从查询中调用过程。你需要把它变成一个函数,让它返回一个值
最后,不允许在从查询调用的子例程中使用事务控制语句(COMMIT、ROLLBACK)。我想您可以在函数中使用自治事务,但坦率地说,我认为这是个坏主意。最好是从匿名PL/SQL块调用您的过程:
DECLARE
intVar INT;
strStatus VARCHAR2(2000);
BEGIN
insert_datatable(n => intVar, status => strStatus);
END;
首先,请纠正明显的语法错误,如缺少分号等,因此不是代码检查服务。请尊重那些在这里自愿付出时间和努力的人,他们将在这里发布编译代码。谢谢 其次,您尝试使用
return
语句返回一个值。程序不返回任何内容
第三,不能从查询中调用过程。你需要把它变成一个函数,让它返回一个值
最后,不允许在从查询调用的子例程中使用事务控制语句(COMMIT、ROLLBACK)。我想您可以在函数中使用自治事务,但坦率地说,我认为这是个坏主意。最好是从匿名PL/SQL块调用您的过程:
DECLARE
intVar INT;
strStatus VARCHAR2(2000);
BEGIN
insert_datatable(n => intVar, status => strStatus);
END;
您不需要声明过程本地的
状态
变量;它已声明为OUT
参数。您还应该将COMMIT
和ROLLBACK
语句留在调用过程的块中;这允许在一个事务中调用多个过程,然后可以将它们全部提交或回滚。在过程中也不使用RETURN
语句
创建过程插入\u数据表(
n in int,
状态输出varchar2
)
是
开始
因为我在1。。n环
在数据表(val1,val2,val3)中插入值(1,2,n);
端环;
状态:=‘良好’;
例外情况
当其他人
状态:='失败';
结束;
/
然后可以使用PL/SQL调用它(不能在查询中使用过程,需要一个函数):
声明
p_状态VARCHAR2(20);
开始
插入数据表(
n=>3,
状态=>p_状态
);
DBMS_OUTPUT.PUT_LINE(p_状态);
结束;
/
输出good
并将值放入表中:
瓦尔1 |瓦尔2 |瓦尔3
---: | ---: | ---:
1 | 2 | 3
1 | 2 | 3
1 | 2 | 3
dbfiddle您不需要声明过程本地的
状态
变量;它已声明为OUT
参数。您还应该将COMMIT
和ROLLBACK
语句留在调用过程的块中;这允许在一个事务中调用多个过程,然后可以将它们全部提交或回滚。在过程中也不使用RETURN
语句
创建过程插入\u数据表(
n in int,
状态输出varchar2
)
是
开始
因为我在1。。n环
在数据表(val1,val2,val3)中插入值(1,2,n);
端环;
状态:=‘良好’;
例外情况
当其他人
状态:='失败';
结束;
/
然后可以使用PL/SQL调用它(不能在查询中使用过程,需要一个函数):
声明
p_状态VARCHAR2(20);
开始
插入数据表(
n=>3,
状态=>p_状态
);
DBMS_OUTPUT.PUT_LINE(p_状态);
结束;
/
输出good
并将值放入表中:
瓦尔1 |瓦尔2 |瓦尔3
---: | ---: | ---:
1 | 2 | 3
1 | 2 | 3
1 | 2 | 3
dbfiddle为
varchar2
给出一个长度,例如varchar2(15)
,在状态的末尾放置分号:='fail'
和返回状态
。为varchar2
给出一个长度,例如varchar2(15)
,在状态:='fail'
和返回状态
的末尾添加分号。感谢您和Bob Jarvis。为语法错误道歉我几乎没有时间重新创建一个示例程序,而且我对函数更加熟悉。谢谢你和Bob Jarvis。为语法错误道歉我几乎没有时间重新创建一个示例过程,而且我对函数更加熟悉。