存儲過程調用另一個存儲過程
⑴ 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、調用新的存儲過程,可以看到結果里也是返回表數據。