Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何使用INSERT和out参数调用过程?_Sql_Oracle - Fatal编程技术网

Sql 如何使用INSERT和out参数调用过程?

Sql 如何使用INSERT和out参数调用过程?,sql,oracle,Sql,Oracle,我正在研究一个基于IN参数自动执行某些插入的过程。我还想知道插入是否失败,所以我创建了一个异常,如果发生任何错误,它将返回“失败”。我已经完成了这个过程,如果我只是运行这个过程,我确信它会执行插入操作,但是我需要在另一个过程中使用它,因此我需要能够访问插入的状态。通常我会选择*into变量,但因为我的过程中有INSERT,所以在查询中使用INSERT时会出现错误。请帮助我找到一种方法来调用我的过程,以了解它们是否失败,并相应地采取行动 以下是一组数据样本和一个程序样本,其功能与我的类似: 创建

我正在研究一个基于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。为语法错误道歉我几乎没有时间重新创建一个示例过程,而且我对函数更加熟悉。