1. 程式人生 > >儲存過程中的out,output,return 的使用

儲存過程中的out,output,return 的使用

output 型別的引數需要在儲存過程的引數列表中新增。output型別的引數傳入儲存過程後還會返回其執行後的值。

return value型別的引數不需要在儲存過程的引數列表中新增。return value型別的引數就是儲存過程最後return的值。

資料庫中使用output值和return值:

-------------------------------------------------------

--數獲儲存過程中的OUTPUT引數和返回值獲取

-------------------------------------------------------

CREATE PROCEDURE

 Proc_Test;1

    @INPUT int,

    @OUTPUT int output

AS

BEGIN

    SET NOCOUNT ON;

    SELECT @OUTPUT=@INPUT

    RETURN @INPUT+1

END

GO

--呼叫output值和return返回值

DECLARE @OUT int,@RETURN int

EXEC @RETURN=Proc_Test;1

       0,

       @OUT output

SELECT [返回值]=@RETURN,[OUTPUT]=@OUT

返回值        OUTPUT

----------- -----------

1           0

-----------------------------------------------------

-- SP_EXECUTESQL中的OUTPUT引數獲取

-----------------------------------------------------

DECLARE @Para1 int,@Para2 int,@SUM int

EXECUTE SP_EXECUTESQL

N'SELECT @[email protected][email protected]

',

N'@Para1 INT,@Para2 INT,@SUM INT OUTPUT ',

5,5,@SUM OUTPUT

SELECT [OUTPUT]=@SUM

OUTPUT

-----------

10

======================================================================

下面在.net下呼叫儲存過程:

  1. <%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>   
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">   
  3. <html xmlns="http://www.w3.org/1999/xhtml">   
  4. <head runat="server">   
  5.     <title>使用儲存過程</title>   
  6.     <mce:style type="text/css"><!--  
  7.         #form1   
  8.         {   
  9.             margin-left: 206px;   
  10.         }   
  11. --></mce:style><style type="text/css" mce_bogus="1">        #form1   
  12.         {   
  13.             margin-left: 206px;   
  14.         }   
  15.     </style>   
  16. </head>   
  17. <body>   
  18.     <form id="form1" runat="server" style="border-style: none; width: 339px;">   
  19.     <div>   
  20.     </div>   
  21.     <asp:Label ID="Label3" runat="server" Text=" 輸  入  參  數:"></asp:Label>   
  22.     <asp:TextBox ID="Input" runat="server" BorderStyle="NotSet"></asp:TextBox>   
  23.  <asp:ImageButton ID="ImageButton1" runat="server" ImageUrl="~/提交.GIF"    
  24.         onclick="ImageButton1_Click" style="height: 20px" />   
  25.     <hr width="95%" />   
  26.     <br />   
  27.     <asp:Label ID="Label1" runat="server" Text="OUTPUT引數:"></asp:Label>   
  28.     <asp:Label ID="Output" runat="server" BorderColor="#6600FF" BorderStyle="None"    
  29.         BorderWidth="1px" Width="100px">暫無</asp:Label>   
  30.     <hr width="95%" />   
  31.     <br />   
  32.     <asp:Label ID="Label4" runat="server" Text="RETURN返回:"></asp:Label>   
  33.     <asp:Label ID="Return" runat="server" BorderColor="#6600FF" BorderWidth="1px"    
  34.         Width="100px" BorderStyle="None">暫無</asp:Label>   
  35.     </form>   
  36. </body>   
  37. </html>  
  1. protected void ImageButton1_Click(object sender, ImageClickEventArgs e)   
  2. {   
  3.     //定義資料庫連線和SqlCommand物件   
  4.     SqlConnection Conn=new SqlConnection(ConfigurationManager.ConnectionStrings["TestConnection"].ToString());   
  5.     SqlCommand Cmd=new SqlCommand("Proc_Test;1",Conn);   
  6.     Cmd.CommandType = CommandType.StoredProcedure;   
  7.     //指定引數型別   
  8.     SqlParameter input = Cmd.Parameters.Add("@INPUT", SqlDbType.Int);   
  9.     SqlParameter output = Cmd.Parameters.Add("@OUTPUT", SqlDbType.Int);   
  10.     SqlParameter return_ = Cmd.Parameters.Add("@RETURN", SqlDbType.Int);   
  11.     //指定引數方向   
  12.     input.Direction = ParameterDirection.Input;   
  13.     output.Direction = ParameterDirection.Output;   
  14.     return_.Direction = ParameterDirection.ReturnValue;   
  15.     //引數賦值   
  16.     if (Input.Text == "")   
  17.     {   
  18.         input.Value = 0;   
  19.     }   
  20.     else  
  21.     {   
  22.         input.Value = Convert.ToInt32(Input.Text);   
  23.     }   
  24.     //呼叫儲存過程   
  25.     Conn.Open();   
  26.     Cmd.ExecuteNonQuery();   
  27.     Conn.Close();   
  28.     Output.Text = output.Value.ToString();//獲取output值   
  29.     Return.Text = return_.Value.ToString();//獲取返回值   
  30. }  
轉載:http://www.cnblogs.com/lengbingshy/archive/2010/02/22/1671262.html

CREATETABLE[dbo].[Order](
[o_id][bigint]IDENTITY(1,1NOTFORREPLICATIONNOTNULL,
[o_buyerid][int]NOTNULL
)

1.OUPUT引數返回值
例: 向Order表插入一條記錄,返回其標識

CREATEPROCEDURE[dbo].[nb_order_insert](
@o_buyeridint ,
@o_idbigint OUTPUT
)
AS

BEGIN
SET NOCOUNT ON;
BEGIN

INSERTINTO[Order](o_buyerid )
VALUES (@o_buyerid )
SET@o_id=@@IDENTITY

END
END
儲存過程中獲得方法:

DECLARE@o_buyeridint
DECLARE@o_idbigint
EXEC[nb_order_insert]@o_buyerid ,@o_id output;
2.RETURN過程返回值

CREATEPROCEDURE[dbo].[nb_order_insert](
@o_buyeridint ,
@o_idbigint OUTPUT
)
AS

BEGIN
SET NOCOUNT ON;
IF(EXISTS(SELECT*FROM[Shop]WHERE[s_id]=@o_shopid))
BEGIN

INSERTINTO[Order](o_buyerid )
VALUES (@o_buyerid )
SET@o_id=@@IDENTITY

RETURN1 — 插入成功返回1
END

ELSE
RETURN0 — 插入失敗返回0
END

儲存過程中的獲取方法
DECLARE@o_buyeridint
DECLARE@o_idbigint
DECLARE@resultbit
EXEC@result=[nb_order_insert]@o_buyerid ,@o_id output create proc Proc_OutPutTest--建立 @numA int,--numA為儲存過程的引數 @numB int,--numB為另一引數 @numReturn int output--此為Output,也就是儲存過程的返回值 as begin if(@numA>@numB) set @[email protected] else set @[email protected] --A>B的時候返回A,否則返回B end go declare @numReceive int --先宣告一個變數用來接收儲存過程的返回值 exec Proc_OutPutTest 1,2, @numReceive output --呼叫儲存過程並用@numReturn接收儲存過程的返回值 select @numReceive--將會返回(1,2)中較大的數字:2 go create proc Proc_OutTest--新建儲存過程 @numC int,--引數C @numD int,--引數D @numE int out--引數E用來返回 as begin  if(@numC>@numD) set @[email protected]--如果C>D,將C賦值給E else  set 

相關推薦

關於sql server 在儲存過程建立臨時表並往臨時表插入資料時出現亂碼的問題

  此前在客戶一個繁體系統的sql  server中執行儲存過程的時候出現亂碼,經查發現建立臨時表後,往臨時表中插入資料時得到的資料是亂碼的,所以檢視建立表的sql指令碼,經查需要將變數型別設定為  

儲存過程建立臨時表為何沒有許可權?

oracle在儲存過程中建立臨時表,執行execute immediate str;報許可權不夠,但是複製出這個sql,直接在sql視窗執行成功,原因如下: 在儲存過程中的所有操作都必須直接顯式授權,不能通過角色授權。你必須把 CREATE TABLE 許可權顯式授予建立 

計算機數值型資料二進位制形式儲存過程的原碼反碼與補碼

在計算機系統中,數值一律用補碼來表示和儲存。原因在於,使用補碼,可以將符號位和數值域統一處理;同時,加法和減法也可以統一處理。此外,補碼與原碼相互轉換,其運算過程是相同的,不需要額外的硬體電路。

Oracle 儲存過程執行動態SQL動態表名

create or replace procedure mw_sys.clearrubbishdatefy2 is type table_type is table of mw_app.mwt_ud_yscsjdl.tablename%type; tablenameAr

儲存過程動態拼接sql拼接單引號問題

create or replace procedure mergerOrder(       v_ids in varchar2,       v_productCode in varchar2,       v_productCateCode in varchar2)

儲存過程outoutputreturn 的使用

output 型別的引數需要在儲存過程的引數列表中新增。output型別的引數傳入儲存過程後還會返回其執行後的值。return value型別的引數不需要在儲存過程的引數列表中新增。return value型別的引數就是儲存過程最後return的值。 資料庫中使用out

MySQL儲存過程的INOUTINOUT型別 用法

MySQL儲存過程中有IN,OUT,INOUT型別 ----------------------------------- ## IN IN引數只用來向過程傳遞資訊,為預設值。 ## MySQL儲存過程"in"引數:跟C語言的函式引數的值傳遞類似,MySQL儲存過程內部

Oracle 儲存過程傳送郵件並支援使用者驗證 中文標題和內容

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

MySQL儲存過程的3種迴圈,儲存過程的基本語法,ORACLE與MYSQL的儲存過程/函式的使用區別退出儲存過程方法

  學無止境 部落格園   首頁   新隨筆   聯絡   訂閱  管理 隨筆-1968  評論-103  文章-4&

SQL Server資料庫的儲存過程定義的臨時表真的有必要顯式刪除(drop table #tableName)嗎?

問題背景 在寫SQL Server儲存過程中,如果儲存過程中定義了臨時表,有些人習慣在儲存過程結束的時候一個一個顯式地刪除過程中定義的臨時表(drop table #tName),有些人又沒有這個習慣,對於不明真相的群眾或者喜歡思考的人會問,儲存過程中定義的臨時表,最後要不要主動刪除,為什麼

儲存過程關於出現null的問題

假設有一個表A,定義如下: create table A( id varchar2(50) primary key not null, vcount number(8) not null, bid varchar2(50) not null -- 外來鍵 );如果在儲存過程中

Sql Server儲存過程輸入和輸出引數(簡單例項一看就懂)

-- ===================【建立儲存過程】===================== USE [Message] GO /****** Object: StoredProcedure [dbo].[讀取外部資料庫查詢] Script Date:

SQL Server 儲存過程處理多個查詢條件的幾種常見寫法分析我們該用那種寫法

最近發現還有不少做開發的小夥伴,在寫儲存過程的時候,在參考已有的不同的寫法時,往往很迷茫, 不知道各種寫法孰優孰劣,該選用那種寫法,以及各種寫法優缺點,本文以一個簡單的查詢儲存過程為例,簡單說一下各種寫法的區別,以及該用那種寫法 專業DBA以及熟悉資料庫的同學請無視。

[PL/SQL] 請教大家一個問題儲存過程需要幾個commit?

如果中間有語句發生錯誤就不一樣了,寫了一個測試的例子,看看對你有幫助沒有 drop table aatest; create table aatest (nid number,nname varchar2(16)) insert into aatest(nid,nname)values(1,'00

儲存過程表記錄內容之間的複製

現在有表A,表B, 要把B表中的某條記錄取出來,然後選取指定的欄位複製到表A中,SQL語法如下declare @Id int @Id = SCOPE_IDENTITY() insert into T

mysql儲存過程之引數(INOUT或INOUT)瞭解下

    在現實應用中,開發的儲存過程幾乎都需要引數,就是這些引數,使得儲存過程更加靈活和有用。 在mysql中,引數有三種模式:IN,OUT或INOUT:IN - 是預設模式。在儲存過程中定義IN引數時

MySQL儲存過程定義變數有兩種方式

MySQL儲存過程中,定義變數有兩種方式: 1.使用set或select直接賦值,變數名以 @ 開頭. 例如:set @var=1; 可以在一個會話的任何地方宣告,作用域是整個會話,稱為會話變數。

測試儲存過程發生異常時之前DML操作會不會rollback

<span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:14px;">步驟:</span></span><span

SQLserver 在儲存過程建立函式建立檢視

alter PROCEDURE usp_sumgoods(@supplierid VARCHAR(50)) as BEGIN if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[GetM

【SQLServer】 儲存過程使用IN函式

在儲存過程中使用IN函式,傳入多個引數時,會有問題,三種解決方案: 新增函式: create FUNCTION [dbo].[Split2] ( @RowData varchar(max