存儲過程參數
⑴ Oracle存儲過程及舉例(幾種參數情況的存儲
create table TESTTABLE
(
id1 VARCHAR2(12),
name VARCHAR2(32)
)
select t.id1,t.name from TESTTABLE t
insert into TESTTABLE (ID1, NAME)
values ('1', 'zhangsan');
insert into TESTTABLE (ID1, NAME)
values ('2', 'lisi');
insert into TESTTABLE (ID1, NAME)
values ('3', 'wangwu');
insert into TESTTABLE (ID1, NAME)
values ('4', 'xiaoliu');
insert into TESTTABLE (ID1, NAME)
values ('5', 'laowu');
---創建存儲過程
create or replace procere test_count
as
v_total number(1);
begin
select count(*) into v_total from TESTTABLE;
DBMS_OUTPUT.put_line('總人數:'||v_total);
end;
--准備
--線對scott解鎖:alter user scott account unlock;
--應為存儲過程是在scott用戶下。還要給scott賦予密碼
---alter user scott identified by tiger;
---去命令下執行
EXECUTE test_count;
----在ql/spl中的sql中執行
begin
-- Call the procere
test_count;
end;
create or replace procere TEST_LIST
AS
---是用游標
CURSOR test_cursor IS select t.id1,t.name from TESTTABLE t;
begin
for Test_record IN test_cursor loop---遍歷游標,在列印出來
DBMS_OUTPUT.put_line(Test_record.id1||Test_record.name);
END LOOP;
test_count;--同時執行另外一個存儲過程(TEST_LIST中包含存儲過程test_count)
end;
-----執行存儲過程TEST_LIST
begin
TEST_LIST;
END;
---存儲過程的參數
---IN 定義一個輸入參數變數,用於傳遞參數給存儲過程
--OUT 定義一個輸出參數變數,用於從存儲過程獲取數據
---IN OUT 定義一個輸入、輸出參數變數,兼有以上兩者的功能
--這三種參數只能說明類型,不需要說明具體長度 比如 varchar2(12),defaul 可以不寫,但是作為一個程序員最好還是寫上。
---創建有參數的存儲過程
create or replace procere test_param(p_id1 in VARCHAR2 default '0')
as v_name varchar2(32);
begin
select t.name into v_name from TESTTABLE t where t.id1=p_id1;
DBMS_OUTPUT.put_line('name:'||v_name);
end;
----執行存儲過程
begin
test_param('1');
end;
default '0'
---創建有參數的存儲過程
create or replace procere test_paramout(v_name OUT VARCHAR2 )
as
begin
select name into v_name from TESTTABLE where id1='1';
DBMS_OUTPUT.put_line('name:'||v_name);
end;
----執行存儲過程
DECLARE
v_name VARCHAR2(32);
BEGIN
test_paramout(v_name);
DBMS_OUTPUT.PUT_LINE('name:'||v_name);
END;
-------IN OUT
---創建存儲過程
create or replace procere test_paramINOUT(p_phonenumber in out varchar2)
as
begin
p_phonenumber:='0571-'||p_phonenumber;
end;
----
DECLARE
p_phonenumber VARCHAR2(32);
BEGIN
p_phonenumber:='26731092';
test_paramINOUT(p_phonenumber);
DBMS_OUTPUT.PUT_LINE('新的電話號碼:'||p_phonenumber);
END;
-----sql命令下,查詢當前用戶的存儲過程或函數的源代碼,
-----可以通過對USER_SOURCE數據字典視圖的查詢得到。USER_SOURCE的結構如下:
SQL> DESCRIBE USER_SOURCE ;
Name Type Nullable Default Comments
---- -------------- -------- -------
-------------------------------------------------------------------------------------------------------------
NAME VARCHAR2(30) Y Name of the object
TYPE VARCHAR2(12) Y Type of the object: "TYPE", "TYPE BODY", "PROCEDURE", "FUNCTION",
"PACKAGE", "PACKAGE BODY" or "JAVA SOURCE"
LINE NUMBER Y Line number of this line of
source
TEXT VARCHAR2(4000) Y Source text
SQL>
---查詢出存儲過程的定義語句
select text from user_source WHERE NAME='TEST_COUNT';
----查詢存儲過程test_paramINOUT的參數
SQL> DESCRIBE test_paramINOUT;
Parameter Type Mode Default?
------------- -------- ------ --------
P_PHONENUMBER VARCHAR2 IN OUT
SQL>
---查看當前的存儲過程的狀態是否正確,
---VALID為正確,INVALID表示存儲過程無效或需要重新編譯
SELECT STATUS FROM USER_OBJECTS WHERE OBJECT_NAME='TEST_COUNT';
-----如果要檢查存儲過程或函數的依賴性,可以通過查詢數據字典USER_DENPENDENCIES來確定,該表結構如下:
SQL> DESCRIBE USER_DEPENDENCIES;
Name Type Nullable Default Comments
-------------------- ------------- -------- ------- ----------------------------------------------------------
NAME VARCHAR2(30) Name of the object
TYPE VARCHAR2(17) Y Type of the object
REFERENCED_OWNER VARCHAR2(30) Y Owner of referenced object (remote owner if remote object)
REFERENCED_NAME VARCHAR2(64) Y Name of referenced object
REFERENCED_TYPE VARCHAR2(17) Y Type of referenced object
REFERENCED_LINK_NAME VARCHAR2(128) Y Name of dblink if this is a remote object
SCHEMAID NUMBER Y
DEPENDENCY_TYPE VARCHAR2(4) Y
SQL>
---查詢存儲過程TEST_COUNT的依賴關系
SELECT REFERENCED_NAME,REFERENCED_TYPE FROM USER_DEPENDENCIES WHERE NAME='TEST_COUNT';
⑵ 存儲過程參數輸入和輸出參數有什麼作用
無論是輸入的參數還是輸出的參數,在此過程中都視為一個參數,所以一般情況下對應你定義的參數類型和個數帶入,便可調用。
存儲過程後面的是參數列表,其實存儲過程就是個方法,通過傳遞參數來指導方法完成。輸出參數相當於返回值,會帶output關鍵字。
其它參數要提前賦值,而output不需要提前賦值,只需要提供一個變數,在存儲過程執行完的時候,output類型的變數值就會修改,獲得返回值,只能通過這個方法獲得返回值,而不能像函數一樣直接返回結果。因為存儲過程是沒有返回值的。
(2)存儲過程參數擴展閱讀
1、存儲過程只在創造時進行編譯,以後每次執行存儲過程都不需再重新編譯,而一般SQL語句每執行一次就編譯一次,所以使用存儲過程可提高資料庫執行速度。
2、當對資料庫進行復雜操作時(如對多個表進行Update,Insert,Query,Delete時),可將此復雜操作用存儲過程封裝起來與資料庫提供的事務處理結合一起使用。
3、存儲過程可以重復使用,可減少資料庫開發人員的工作量。
4、安全性高,可設定只有某些用戶才具有對指定存儲過程的使用權。
⑶ 存儲過程:帶參數類型有哪些
有in,out,inout
in:表示參數從外部傳入到裡面使用(過程內部使用),可以是直接數據也可以是保存數據的變數
out:表示參數是從過程裡面吧數據保存到變數中,交給外部使用,傳入的必須的變數
inout:數據可以從外部傳入到過程內部使用,同時內部操作之後,又會將數據返還給外部
⑷ 執行存儲過程怎麼傳入參數
在Oracle中定義存儲過程的時候有定義傳入參數的個數和類型的。
createprocerepro_name(v_para1invarchar2,v_para2invarchar2)
調用的時候:
declare
v_para1varchar2(30):='parameter1';
v_para2varchar2(30):='parameter2';
begin
pro_name(v_para1,v_para2);
end;
/
⑸ 存儲過程里怎麼什麼是輸出參數什麼是輸入參數
使用輸出參數類似於使用返回值。但是輸出參數具有兩個重要的優勢。可以使用輸出參數從存儲過程傳遞出VarChar,Int,Money或任何其他數據類型的值。而返回值則只能返回整數。
輸出參數的另一個優勢就是在一個存儲過程中可以有多個輸出參數。一個存儲過程可以包含1024個參數(其中包括輸入和輸出參數),但是只能包含一個返回值。
比如下面的存儲過程根據提供的作者名來檢索該作者的姓,該存儲過程有一個名為@firstname的輸入參數和一個@lastname的輸出參數。
Create Procere GetLastName (@firstname Varchar(20),@lastname Varchar(20) Output) As
Select @lastname=au_lname From Authors Where au_fname=@firstname
程序清單使用了這個存儲過程。注意程序清單中如何創建參數,指定尺寸和設置參數方向。在執行了存儲過程後,就可以從Parameters集合中獲取輸出的參數值了。注意是如何使用IsDBNull()來 判別輸出參數是否有值。如果沒有返回任何值,則不要把它試圖賦值給字元串變數。
<%@ Import Namespace="System.Data.SqlClient" %>
<%@ Import Namespace="System.Data" %>
<%
Dim conPubs As SqlConnection
Dim cmdLastName As SqlCommand
Dim parmLastName As SqlParameter
Dim strLastName As String
'本站為了防止在源代碼中泄露用戶名和密碼,使用通過web.config提供的資料庫連接字元串。
'你在本地使用時,將下面這三行語句刪除或注釋掉。
Dim strConString as string
strConString=ConfigurationSettings.AppSettings("conString")
conPubs=New SqlConnection(strConString)
'你本地測試時,將下面這行的注釋符去掉,並填入相應的資料庫用戶名和密碼,資料庫名和伺服器名。
'conPubs = New SqlConnection( "Server=localhost;uid=sa;pwd=secret;database=pubs" )
cmdLastName = New SqlCommand( "getLastname", conPubs )
cmdLastName.CommandType = CommandType.StoredProcere
' FirstName Input Parameter
cmdLastName.Parameters.Add( "@firstname", "Ann" )
' LastName Output Parameter
parmLastName = cmdLastName.Parameters.Add( "@lastname", SqlDbType.Varchar )
parmLastName.Size = 40
parmLastName.Direction = ParameterDirection.Output
' Execute Command
conPubs.Open()
cmdLastName.ExecuteNonQuery()
' Retrieve value of output parameter
If Not IsDBNull( cmdLastName.Parameters( "@lastname" ).Value ) Then
strLastName = cmdLastName.Parameters( "@lastname" ).Value
Else
strLastName = "Unknown"
End If
conPubs.Close()
%>
The last name is <%=strLastName%>
⑹ 存儲過程參數傳遞有幾種方法
參數傳遞?
參數有in參數、out參數、in out參數
變數可用set和select賦值
獲取返回值只需設置變數、到時輸出就行
單行數據定義固定變數數、
如果結果是數據集、要用游標cursor
⑺ SQL一個帶參數的存儲過程寫法
你的這個做法沒有意義,一般存儲過程主要是針對sql語句執行效率低和數據完整性等來說的,你用這種方法就單單為了查詢一個表中的TOP信息,這樣與存儲過程的有點恰恰相反,因為這個方法實現存儲過程中取出你所要的信息,同是也能用同樣的方法更簡便的從表中取出你要的信息
⑻ 【存儲過程】存儲過程中所有定義的參數都要賦值么
1,存儲過程必須賦值 不論用沒用但是賦值可以在創建過程時賦值,也可以在執行時賦值如;exec {存儲過程名} 聲明的變數次序(這是輸入型參數)
2,你這樣賦值有問題,set只能復制一個值,如果給多個變數賦值得話就使用「select」
希望這些能給你一些幫助。
⑼ 存儲過程參數的傳遞
解決方案一:
使用動態SQL , 即定義一個 字元串 @sql , 組合好以後, Exec( @sql )
解決方案二:
使用 CHARINDEX 取代掉 LIKE
例如:
Select
ClassName,ClassType,ClassID,ClassImg
from
OA_Class
where
classid=classparentid
AND charindex(',' + rtrim(classId) + ',', ',' + classId(@classId) + ',') > 0