存储过程调用另一个存储过程
⑴ oracle中,一个存储过程怎么调用另一个存储过程这两个存储过程都带有各自的参数。直接调用似乎不行。
直接调用就可以了。举个例子把 B 存储过程调用A 存储过程。
PROCEDURE A (p_1 in number,p_2 out number)
is
v_1 number;
begin
V_1:=p_1;
p_2:=v_1;
end A;
(1)如果A 与B同在一个package里面的话。那么 B里面直接可以调用A
PS:如果A,B在同一个Package 中无法调用的话,那么很可能是A,B在Spec里没有声明。一个package包含Spec 和Body,两层。不能调用很可能没有声明。声明后应该ok!
PROCEDURE B(p_1 in number)
is
v_result number;
begin
v_result =A(p_1);
end B;
其中v_result就是调用A的结果,A的返回值。
(2)如果A与B不在同一个package的话
那么B在调用A 的时候,需要加上pkg的名字
比如:A 存储过程在pkg :xxom_test_pkg 中
PROCEDURE B(p_1 in number)
is
v_result number;
begin
v_result = xxom_test_pkg .A(p_1);
end B;
----------------------------------------------------------
以上简单介绍了存储过程的调用。
希望对你有帮助
⑵ oracle瀛桦偍杩囩▼璋幂敤鍙︿竴涓瀛桦偍杩囩▼
璋幂敤鏂规硶涓嶆g‘
璋幂敤镞舵病链夊疄鍙傦纴浣犲簲璇ユ寜镦у嚱鏁板畾涔夋椂鍙傛暟镄勪釜鏁板拰绫诲瀷缁椤嚱鏁颁紶阃掑悓镙蜂釜鏁板拰绫诲瀷镄勫弬鏁帮纴杩欐槸链锘烘湰镄勫晩
浣犲畾涔夌殑鏄涓鍑芥暟锛屾槸鍑芥暟灏辫佽繑锲炲硷纴浣犲缑鐢ㄤ竴涓鍑芥暟杩斿洖鍊煎悓镙风被鍨嬬殑鍙橀噺铡绘帴鏀惰繖涓杩斿洖鍊
⑶ sql Server 在一个存储过程中调用另外一个存储过程获取返回值,出现报错
第一种方法: 使用output参数
USE AdventureWorks;
GO
IF OBJECT_ID ( 'Proction.usp_GetList', 'P' ) IS NOT NULL
DROP PROCEDURE Proction.usp_GetList;
GO
CREATE PROCEDURE Proction.usp_GetList @proct varchar(40)
, @maxprice money
, @compareprice money OUTPUT
, @listprice money OUT
AS
SELECT p.name AS Proct, p.ListPrice AS 'List Price'
FROM Proction.Proct p
JOIN Proction.ProctSubcategory s
ON p.ProctSubcategoryID = s.ProctSubcategoryID
WHERE s.name LIKE @proct AND p.ListPrice < @maxprice;
-- Populate the output variable @listprice.
SET @listprice = (SELECT MAX(p.ListPrice)
FROM Proction.Proct p
JOIN Proction.ProctSubcategory s
ON p.ProctSubcategoryID = s.ProctSubcategoryID
WHERE s.name LIKE @proct AND p.ListPrice < @maxprice);
-- Populate the output variable @compareprice.
SET @compareprice = @maxprice;
GO
另一个存储过程调用的时候:
Create Proc Test
as
DECLARE @compareprice money, @cost money
EXECUTE Proction.usp_GetList '%Bikes%', 700,
@compareprice OUT,
@cost OUTPUT
IF @cost <= @compareprice
BEGIN
PRINT 'These procts can be purchased for less than
$'+RTRIM(CAST(@compareprice AS varchar(20)))+'.'
END
ELSE
PRINT 'The prices for all procts in this category exceed
$'+ RTRIM(CAST(@compareprice AS varchar(20)))+'.'
第二种方法:创建一个临时表
create proc GetUserName
as
begin
select 'UserName'
end
Create table #tempTable (userName nvarchar(50))
insert into #tempTable(userName)
exec GetUserName
select #tempTable
--用完之后要把临时表清空
drop table #tempTable--需要注意的是,这种方法不能嵌套。例如:
procere a
begin
...
insert #table exec b
end
procere b
begin
...
insert #table exec c
select * from #table
end
procere c
begin
...
select * from sometable
end
--这里a调b的结果集,而b中也有这样的应用b调了c的结果集,这是不允许的,
--会报“INSERT EXEC 语句不能嵌套”错误。在实际应用中要避免这类应用的发生。
第三种方法:声明一个变量,用exec(@sql)执行:
1);EXEC 执行SQL语句
declare @rsql varchar(250)
declare @csql varchar(300)
declare @rc nvarchar(500)
declare @cstucount int
declare @ccount int
set @rsql='(select Classroom_id from EA_RoomTime where zc='+@zc+' and xq='+@xq+' and T'+@time+'=''否'') and ClassroomType=''1'''
--exec(@rsql)
set @csql='select @a=sum(teststucount),@b=sum(classcount) from EA_ClassRoom where classroom_id in '
set @rc=@csql+@rsql
exec sp_executesql @rc,N'@a int output,@b int output',@cstucount output,@ccount output--将exec的结果放入变量中的做法
--select @csql+@rsql
--select @cstucount
⑷ oracle中怎么在存储过程中调用同一个包的其他存储过程
在存储过程或函数里调用oracle包的话,首先要有执行这个包的权限;如果包属于其他的用户(不是系统包),调用时:用户名.包名.存储过程(参数)名或者
变量:=用户名.包名.函数(参数);因为函数有返回值,变量类型要跟函数返回值的类型一致。
在command
下调用的话:exec
用户名.包名.存储过程名(参数);select
用户名.包名.函数名(参数)
from
al;就可以了。包属于当期用户可以不写用户名。
⑸ mysql如何在存储过程中调用另外一个存储过程(这个过程用于建一个内存表供调用存储使用,结束后自动删除表)
execute +调用的存储过程名
根据你的存储过程前后关系,放在合适的位置调用
⑹ SQL存储过程如何调用存储过程
1、首先先创建一个存储过程,代码如图,存储过程主要的功能是为表JingYan插入新的数据。
2、执行这几行代码,看到执行成功,数据库里现在已经有存储过程sp_JY。
3、先看下JingYan表里目前的数组,如图,只有三行数据。
4、在mysql里,调用存储过程,只需要用call关键字,带上存储过程的名称就行了,当然有参数时,需要带个参数。代码如图
5、执行了这个存储过程的调用之后,再看下JingYan表里的数据,可以看到现在的数据已经是四条了,说明调用存储过程成功插入了一条新的数据。
6、再添加一个存储过程,该存储过程用select语句,返回表数据。
7、调用新的存储过程,可以看到结果里也是返回表数据。