❶ ORACLE中如何為存儲過程傳遞參數
和其它語言沒什麼區別,
exec 存儲過程(參數1,參數2,...參數n);
❷ 如何給存儲過程,傳一個數組參數
方法一 分割
例:通過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 whereID=@TID
SET @PointerPrev = @PointerCurr+1
End
else
Break
End
--刪除最後一個,因為最後一個後面沒有逗號,所以在循環中跳出,需另外再刪除
set @TId=cast(SUBSTRING(@ID,@PointerPrev,LEN(@ID)-@PointerPrev+1) as int)
Delete from News whereID=@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)
IF @str > ''
INSERT @r(value) VALUES(@str)
RETURN
這個方法更加可怕~~~輾轉網路,找到了一個還不錯的方法,用OPENXML,這個SQL2000就支持了。
方法三 xml
應該用SQL2000 OpenXML更簡單,效率更高,代碼更可讀:
CREATE Procere [dbo].[ProctListUpdateSpecialList]
(
@ProctId_Array NVARCHAR(2000),
@MoleId INT
)
AS
delete from ProctListSpecial whereMoleId=@MoleId
-- If empty, return
IF (@ProctId_Array IS NULL OR LEN(LTRIM(RTRIM(@ProctId_Array))) = 0)
RETURN
DECLARE @idoc int
EXEC sp_xml_preparedocument @idoc OUTPUT, @ProctId_Array
Insert into ProctListSpecial (MoleId,ProctId)
Select
@MoleId,C.[ProctId]
FROM
OPENXML(@idoc, '/Procts/Proct', 3)
with (ProctId int ) as C
where
C.[ProctId] is not null
EXEC sp_xml_removedocument @idoc
哇,看起來還是很復雜的說。有木有更好的辦法呢?
既然是OPENXML,為啥不用XML呢?於是查到,SQL2005以上都支持XML。Good,找到一片天了。
利用SQL2005的XML/XQuery功能,可以很方便的解決傳數組參數的問題。
declare @xml xml
set @xml = '<?xml version="1.0"?>
<ArrayOfInt>
<int>1</int>
<int>2</int>
<int>3</int>
</ArrayOfInt>'
select N.value( '(text())[1]','int' ) RoomId from @xml.nodes('/ArrayOfInt/int') V(N)
結果就是
註:上面的數據類型為XML
這樣就可以給存儲過程傳一個集合了,一般是數組,比如主鍵的集合。然後可用通過主鍵集合來查詢記錄。
客戶端可用使用序列化,把list轉化成xml。不過在序列化過程中,遇到了一些小麻煩。
1. .net默認是utf-16,SQL只認識utf-8
2. 出現很討厭的xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
可以用我這個類
public static class SerializeHelper
{
private static readonly XmlSerializerNamespaces Namespaces = new XmlSerializerNamespaces();
static SerializeHelper()
{
//去掉 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
Namespaces.Add(string.Empty, string.Empty);
}
public static string SerializeXml<T>(T obj)
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
using (MemoryStream stream = new MemoryStream())
{
serializer.Serialize(stream, obj, Namespaces);
return Encoding.UTF8.GetString(stream.ToArray());
}
}
public static T DeserializeXml<T>(string obj)
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
using (StringReader reader = new StringReader(obj))
{
return (T)serializer.Deserialize(reader);
}
}
}
SQL與XML,XQuery結合起來,功能會很強大的。
❸ 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> 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.
❺ 如何給SQLSERVER存儲過程傳遞數組參數
但可用其它的方法來實現。 1. You could simulate an array by passing one or more varchar(255) fields with comma-separated values and then use a WHILE loop with PATINDEX and SUBSTR to extract the values. 1、你可以使用幾個VARCHAR(255)欄位來模擬數組,欄位中用逗號分開各個數據,然後使用循環和PATINDEX和SUBSTR分開這些數據。 2. The more usual way to do this would be to populate a temporary table with the values you need and then use the contents of that table from within the stored-procere. Example of this below2、通常這種方法需要為這些數據創建一個臨時表,然後在存儲過程使用表中的內容。如下例create procere mytest @MyParmTempTable varchar(30)asbegin-- @MyParmTempTable contains my parameter list... 這個變數是包含參數的表名-- For simplicity use dynamic sql to into a normal temp table... create table #MyInternalList ( list_item varchar( 2 ) not null)set nocount oninsert #MyInternalList select * from sysobjects insert #MyList values ( 'P' )exec mytest "#MyList"3. If all you wanted to do was use the array/list as input to an IN clause in a WHERE statement you could use :-3、如果你想在IN子句里使用輸入的數組參數可以這樣做:CREATE PROCEDURE sp_MyProcere (@MyCommaDelimitedString
❻ 執行存儲過程怎麼傳入參數
在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 , 即定義一個 字元串 @sql , 組合好以後, Exec( @sql )
解決方案二:
使用 CHARINDEX 取代掉 LIKE
例如:
Select
ClassName,ClassType,ClassID,ClassImg
from
OA_Class
where
classid=classparentid
AND charindex(',' + rtrim(classId) + ',', ',' + classId(@classId) + ',') > 0
❽ 存儲過程中的表,如何使用 傳參數的方式實現
sql中的表名和列名是不能用變數表示的,如果你想動態的表達,只能用sql拼接的方式
將語句拼成字元串,然後用exec(@sql)來執行
LS的寫錯了,變數要拼在外面
set
@GDebitTotal='Select
sum(CONVERT(money,金額)*(b.gDivvy))
From
『+@StrTemp+』
a
,dz_OtherVoucher
b
Where
gUsedID=0
and
a.gVoucherid=b.gVoucherid
and
gSelectFlag
=
1
and
goperid=0
and
gdc=1'
exec(@GDebitTotal)
❾ sql 存儲過程 怎麼傳入參數
執行帶參數的存儲過程的方法如下:
Exec sp_configure 'allow updates',1 --允許更新系統表。
exec dbo.User_ChangeObjectOwnerBatch 'OldOwner','dbo'
以上是兩個例子。
SQL Server中執行帶參數的存儲過程的方法是:
EXEC 存儲過程名字 '參數1','參數2',數值參數
EXEC 是一個關鍵字。
字元串參數使用單引號括起來,數值參數不需要使用單引號
❿ 給存儲過程傳參數
select * from tablename where c_code=nvl(code,c_code) and nvl(police,c_police) =c_police;
當為null時,c_code = c_code 。