存儲過程參數傳遞
① ORACLE中如何為存儲過程傳遞參數
給你一個 傳遞參數的例子
sql> CREATE OR REPLACE PROCEDURE HelloWorld2 (
2 p_user_name IN VARCHAR2,
3 p_out_val OUT VARCHAR2,
4 p_inout_val IN OUT VARCHAR2
5 ) AS
6 BEGIN
7 dbms_output.put_line('Hello ' || p_user_name || p_inout_val || '!');
8 p_out_val := 'A';
9 p_inout_val := 'B';
10 END HelloWorld2;
11 /
Procere created.
SQL> DECLARE
2 p_outval VARCHAR2(10);
3 p_inoutval VARCHAR2(10) := '~Hi~';
4 BEGIN
5 HelloWorld2('Edward', p_outval, p_inoutval);
6
7 dbms_output.put_line('p_outval=' || p_outval);
8 dbms_output.put_line('p_inoutval=' || p_inoutval);
9 END;
10 /
Hello Edward~Hi~!
p_outval=A
p_inoutval=B
PL/SQL procere successfully completed.
SQL>
② 如何向存儲過程傳遞一個數組參數
方法一 分割
例:通過SQL Server存儲過程傳送數組參數刪除多條記錄
eg. ID 值為'1,2,3' 以下存儲過程就是刪除表中id號為1,2,3的記錄:
CREATE PROCEDURE DeleteNews
@ID nvarchar(500)
as
DECLARE @PointerPrev int
DECLARE @PointerCurr int
DECLARE @TId int
Set @PointerPrev=1
while (@PointerPrev < LEN(@ID))
Begin
Set @PointerCurr=CharIndex(',',@ID,@PointerPrev)
if(@PointerCurr>0)
Begin
set @TId=cast(SUBSTRING(@ID,@PointerPrev,@[email protected]) as int)
Delete from News where [email protected]
SET @PointerPrev = @PointerCurr+1
End
else
Break
End
--刪除最後一個,因為最後一個後面沒有逗號,所以在循環中跳出,需另外再刪除
set @TId=cast(SUBSTRING(@ID,@PointerPrev,LEN(@ID)[email protected]+1) as int)
Delete from News where [email protected]
GO
這個方法麻煩不?於是又有另外一種方法——臨時表
方法二 Table對象
傳3個參數,都是數組形式還有時間類型用存儲過程更新
@Oid = 1,2,3,4
@Did = 111,222,333,444
@DateArr = '2007-1-1,2007-1-2,2007-1-3,2007-1-4'
CREATE proc Test999
@Oid nvarchar(1000) --ID1
,@Did nvarchar(1000) --ID2
,@DateArr nvarchar(1000) --日期
AS
DECLARE @id1s varchar(8000), @id2s varchar(8000), @dates varchar(8000)
set @[email protected]
set @[email protected]
set @dates = @DateArr
-- 調用函數實現處理
SELECT @[email protected], @[email protected],@dates = @dates
UPDATE A SET terminate_time = B.dt
FROM [Table] A,(
SELECT
id1 = CONVERT(int, Desk_id.value),
id2 = CONVERT(int, room_id.value),
dt = CONVERT(datetime, terminate_time.value)
FROM dbo.f_splitstr(@id1s) Desk_id, dbo.f_splitstr(@id2s) room_id, dbo.f_splitstr(@dates) terminate_time
WHERE Desk_id.id = room_id.id
AND Desk_id.id = terminate_time.id
) B
WHERE A.Desk_id = B.ID1 AND A.room_id = B.ID2
GO這個還用到一個函數f_splitstr
CREATE FUNCTION dbo.f_splitstr(
@str varchar(8000)
)RETURNS @r TABLE(id int IDENTITY(1, 1), value varchar(5000))
AS
BEGIN
DECLARE @pos int
SET @pos = CHARINDEX(',', @str)
WHILE @pos > 0
BEGIN
INSERT @r(value) VALUES(LEFT(@str, @pos - 1))
SELECT
@str = STUFF(@str, 1, @pos, ''),
@pos = CHARINDEX(',', @str)
END
IF @str > ''
INSERT @r(value) VALUES(@str)
RETURN
END
③ 存儲過程參數傳遞有幾種方法
參數傳遞?
參數有in參數、out參數、in
out參數
變數可用set和select賦值
獲取返回值只需設置變數、到時輸出就行
單行數據定義固定變數數、
如果結果是數據集、要用游標cursor
④ 存儲過程傳入參數
num1 NUMBER := 181,182;
這句話錯了啊!
DECLARE
num1 NUMBER ;
BEGIN
num1:=181; ----181,182 是什麼意思? 是要一下子傳兩個數字進去嗎? 這樣做不可以的哦?
Pr_d2_delCar(num1);
END;
⑤ 存儲過程參數的傳遞
解決方案一:
使用動態SQL , 即定義一個 字元串 @sql , 組合好以後, Exec( @sql )
解決方案二:
使用 CHARINDEX 取代掉 LIKE
例如:
Select
ClassName,ClassType,ClassID,ClassImg
from
OA_Class
where
classid=classparentid
AND charindex(',' + rtrim(classId) + ',', ',' + classId(@classId) + ',') > 0
⑥ oracle中調用存儲過程時傳遞參數值的3種方式。。
應該就是這三種吧。
1 , IN (參數值傳過來給存儲過程使用)
2, OUT(存儲過程返回結果給該參數)
3. IN OUT(存儲過程調用該參數的同時,最後還返回結果給調用的參數)
⑦ ORACLE中如何為存儲過程傳遞參數
第一種:只讀。參數是只讀的,不能修改,即調用時傳遞進來的是常量,或者變數(但變數不能在存儲過程中修改正薯)。通常select及DML類型的存儲過程傳遞的是in類型的參數。
第二種:只寫。忽略調用語句傳遞的任何參數,並在函數(過程)內部給這些參數賦值,因此是只寫的。(這種情況是在函數或過程內部給參數重新賦值,但重新賦值後的參舉御者數是無法被外部調用的(好像游標類型的參數除外))
CREATE OR REPLACE PROCEDURE "SCOTT"."SWAP" (firstValue out
number, secondValue out number) is
temp number;
begin
temp := firstValue;
firstValue := secondValue;
secondValue := temp;
end swap;
外部調用:
set serveroutput on;
declare
firstVal number;
secondVal number;
begin
firstVal := 10;
secondVal := 20;
scott.swap(firstVal,secondVal);
dbms_output.put_line('first is ' || firstVal);
dbms_output.put_line('second is ' || secondVal);
end;
無法在外部訪問到firstValue與secondValue的值。此時列印出的結果為:
first is
second is
第三種:讀或寫。這可以完全控制參數,讀取傳遞的參數的值。可以再函數(過程)內部修改參數的值,在退出函數(過程)後,這些參數被賦給在函數內部寫入的值,這樣就可以返回多個值。(即入口參數寫入值後,可以傳遞到函數(過程)的外部,供外部調用的時候使用)
ps:函數中的返回值為如下幾種:
char; varchar2; number; integer; date; boolean; table; record
SQL> CREATE OR REPLACE PROCEDURE HelloWorld2 (
2 p_user_name IN VARCHAR2,
3 p_out_val OUT VARCHAR2,
4 p_inout_val IN OUT VARCHAR2
5 ) AS
6 BEGIN
7 dbms_output.put_line('Hello ' || p_user_name || p_inout_val || '!');
8 p_out_val := 'A';
9 p_inout_val := 'B';
10 END HelloWorld2;
11 /
Procere created.
SQL> DECLARE
2 p_outval VARCHAR2(10);
3 p_inoutval VARCHAR2(10) := '~Hi~';
4 BEGIN
5 HelloWorld2('Edward', p_outval, p_inoutval);
6
7 dbms_output.put_line('p_outval=' || p_outval);
8 拆橡dbms_output.put_line('p_inoutval=' || p_inoutval);
9 END;
10 /
Hello Edward~Hi~!
p_outval=A
p_inoutval=B
PL/SQL procere successfully completed.