當前位置:首頁 » 服務存儲 » 存儲過程傳參
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

存儲過程傳參

發布時間: 2022-02-04 22:31:57

sql server 存儲過程傳參問題. 一個參數如何可以輸入多個參數值

sql server 2005之後,可以使用xml數據類型傳值,然後在存儲過程中將xml解析成表,和temp_test表連接。

sql server 2008之後,可以使用表變數,傳給存儲過程。

Ⅱ sql sever 存儲過程 傳參(字元串)

@allLinename varchar(255)
---參數沒有定義字元長度
默認為1,所以不能字元串

Ⅲ sql存儲過程輸入參數需要傳入多個值,怎麼處理

修改
@UOM Varchar(50)=null為@UOM Varchar(Max)=null

Ⅳ 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.

Ⅳ 存儲過程怎麼傳入數組參數

方法一 分割

例:通過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,@PointerCurr-@PointerPrev) as int)
Delete from News where ID=@TID
SET @PointerPrev = @PointerCurr+1
End
else
Break
End
--刪除最後一個,因為最後一個後面沒有逗號,所以在循環中跳出,需另外再刪除
set @TId=cast(SUBSTRING(@ID,@PointerPrev,LEN(@ID)-@PointerPrev+1) as int)
Delete from News where ID=@TID
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 @id1s=@Oid

set @id2s=@Did

set @dates = @DateArr

-- 調用函數實現處理

SELECT @id1s=@id1s, @id2s=@id2s,@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

Ⅶ 執行存儲過程怎麼傳入參數

在Oracle中定義存儲過程的時候有定義傳入參數的個數和類型的。

createprocerepro_name(v_para1invarchar2,v_para2invarchar2)

調用的時候:

declare
v_para1varchar2(30):='parameter1';
v_para2varchar2(30):='parameter2';
begin
pro_name(v_para1,v_para2);
end;
/

Ⅷ 如何向存儲過程傳遞一個數組參數

方法一 分割

例:通過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,@PointerCurr-@PointerPrev) as int)
Delete from News where ID=@TID
SET @PointerPrev = @PointerCurr+1
End
else
Break
End
--刪除最後一個,因為最後一個後面沒有逗號,所以在循環中跳出,需另外再刪除
set @TId=cast(SUBSTRING(@ID,@PointerPrev,LEN(@ID)-@PointerPrev+1) as int)
Delete from News where ID=@TID
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 @id1s=@Oid

set @id2s=@Did

set @dates = @DateArr

-- 調用函數實現處理

SELECT @id1s=@id1s, @id2s=@id2s,@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

Ⅸ 存儲過程參數的傳遞

解決方案一:
使用動態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中如何為存儲過程傳遞參數

和其它語言沒什麼區別,
exec 存儲過程(參數1,參數2,...參數n);