Saklı yordam veri döndürür
Sonuç kümeleri veya veri bir yordamı çağıran programa dönen iki yolu vardır: çıkış parametreleri ve dönüş kodları. Bu konu, hem yaklaşımlar için bilgi sağlar.
Bir çıktı parametresini kullanarak veri döndürme
Yordam tanım çıktı anahtar kelime için bir parametre belirtirseniz, yordamı çıktığında yordamı çağıran programa parametre geçerli değerini döndürebilir. Çağıran program, çağıran program içinde kullanılabilecek bir değişken parametre değeri kaydetmek için yordamı çalıştırırken çıktı anahtar sözcüğünü kullanmalısınız. Çıkış parametreleri kullanılabilir veri türleri hakkında daha fazla bilgi için bkz: procedure (Transact-sql) oluştur.
Çıkış parametresi örnekler
Aşağıdaki örnek, bir yordam giriş ve bir çıkış parametresi gösterir. @SalesPersonParametresini çağıran program tarafından belirtilen bir girdi değeri alacağı. select deyimi girdi parametresi geçirilen değerin doğru almak için kullanır SalesYTDdeğer. select deyimi de değerine atar @SalesYTDyordam çıktığında çağıran programa değerini verir çıkış parametresi,.
USE AdventureWorks2012;
GO
IF OBJECT_ID('Sales.uspGetEmployeeSalesYTD', 'P') IS NOT NULL
DROP PROCEDURE Sales.uspGetEmployeeSalesYTD;
GO
CREATE PROCEDURE Sales.uspGetEmployeeSalesYTD
@SalesPerson nvarchar(50),
@SalesYTD money OUTPUT
AS
SET NOCOUNT ON;
SELECT @SalesYTD = SalesYTD
FROM Sales.SalesPerson AS sp
JOIN HumanResources.vEmployee AS e ON e.BusinessEntityID = sp.BusinessEntityID
WHERE LastName = @SalesPerson;
RETURN
GO
Aşağıdaki örnek, ilk örnekte oluşturulmuş yordamı çağıran ve çağrılan yordam döndürülen çıkış değeri kaydeder @SalesYTDçağıran programa yerel değişken.
-- Declare the variable to receive the output value of the procedure.
DECLARE @SalesYTDBySalesPerson money;
-- Execute the procedure specifying a last name for the input parameter
-- and saving the output value in the variable @SalesYTDBySalesPerson
EXECUTE Sales.uspGetEmployeeSalesYTD
N'Blythe', @SalesYTD = @SalesYTDBySalesPerson OUTPUT;
-- Display the value returned by the procedure.
PRINT 'Year-to-date sales for this employee is ' +
convert(varchar(10),@SalesYTDBySalesPerson);
GO
Yordam çalıştırıldığında giriş değerleri de çıkış parametreleri için belirtilebilir. Bu yordamı çağıran programdan bir değer alması, değiştirmek veya değeri işlemleri gerçekleştirmek ve sonra yeni değeri çağıran programa dönmek sağlar. Önceki örnekte, @SalesYTDBySalesPersondeğişkenine bir değer önce program çağrıları atanabilir Sales.uspGetEmployeeSalesYTDyordam. Execute deyimi geçerdi @SalesYTDBySalesPersoniçine değişken değeri @SalesYTDÇıkış parametresi. Sonra yordam gövdesinde değeri yeni bir değer üreten hesaplamalar için kullanılabilir. Yeni değeri geri prosedürü değeri güncelleştirme çıkış parametresi, geçerken @SalesYTDBySalesPersonyordam çıktığında değişken. Buna genellikle "referans olarak geçişi yeteneği gibi." denir
Bir yordam çağrısı ve yordam tanım çıktı kullanarak bu parametre tanımlanmamış çıkış için bir parametre belirtirseniz, bir hata iletisi alıyorum. Ancak, çıkış parametreleri olan bir yordamı yürütmek ve çıkış yordamı yürütürken belirtmek değil. Hiçbir hata döndürdü, ancak çıkış değeri arama programı kullanamazsınız.
Imleç veri türü çıktı parametreleri kullanma
Transact-SQLyordamları kullanarak cursorveri türü yalnızca çıkış parametreleri için. Eğer cursorveri türü belirtilen parametre, çıktı ve VARYING anahtar kelimeler için yordam tanımı bu parametre belirtilmelidir. Bir parametre olarak sadece çıkış belirtilebilir ancak VARYING anahtar parametresi bildiriminde belirtilen veri türü olması gerekir cursorve çıkış anahtar da belirtilmelidir.
[!NOT]
cursorVeri türü can't bağlı uygulama değişkenleri aracılığıyla veritabanı API ole db, odbc ve ado db Kitaplığı gibi. Çünkü uygulama prosedürleri ile bir yordam yürütebilirsiniz önce çıkış parametreleri bağlanmalıdır cursorçıkış parametreleri veritabanı API çağrılamaz. Bu yordamlar çağrılabilir Transact-SQLtoplu, yordamlar, ya da sadece tetikler cursorÇıkış değişkeni için atandığı bir Transact-SQLYerel cursordeğişkeni.
Imleç çıkış parametreleri için kurallar
Aşağıdaki kurallar ilgilendirmeyen cursorçıkış parametreleri yordam çalıştırıldığında:
Bir salt ileri imleci için imleci 's sonuç kümesinde döndürülen satırların yalnızca satırları ve ötesi yordamı yürütme sonuç imlecin konumunu örneğin şunlardır:
Nonscrollable imleç bir prosedür üzerinde 100 satır rs adlı bir sonuç kümesi açılır.
Yordam fetches rs sonuç ilk 5 satırları ayarlayın.
Yordamı, çağırana verir.
Satır 6 100 rs ve arayan imlecin aracılığıyla çağırana döndürülen rs oluşur sonuç kümesi rs ilk satırdan önce yerleştirilir.
Yordam çıktığında, imleci ilk satırın önce konumlandırılmış bir salt ileri imleci için tüm sonuç kümesini arama toplu, yordam veya tetikleyiciyi döndürülür. Döndü, ilk satırdan önce imleç konumu ayarlanır.
Yordam çıktığında, imlecin son satırın sonunu konumlandırılmış bir salt ileri imleci için bir boş sonuç kümesi arama toplu, yordam veya tetikleyiciyi döndürülür.
[!NOT]
Bir boş sonuç kümesi boş değer aynı değil.
Yordam çıktığında a scrollable cursor için arama toplu, yordam veya tetikleyiciyi sonuç kümesindeki bütün satırlar döndürülür. Döndü, imleç konumu yordamda yürütülen son getirme konumunda kalır.
İmleci kapalıysa, imleç herhangi bir tür için geri arama toplu, yordam veya tetikleyiciyi sonra boş değer geçirilir. Bir imleç parametresi, atanırsa, ama bu hiçbir zaman imleç açıldığında bu da böyle olacak.
[!NOT]
Kapalı durumu, yalnızca dönüş zamanında önemli. Örneğin, yol yordam daha sonra yeniden açın ve imleci 's sonuç arayan toplu, yordam veya tetikleyiciyi ayarlamak dönmek için yordamı, imleç bir parçası kapatmak için geçerlidir.
Imleç çıkış parametreleri örnekleri
Aşağıdaki örnek, çıktı parametresi, belirtilen yordam oluşturulur @currency\_ cursor kullanarak cursorveri türü. Yordam daha sonra bir toplu olarak adlandırılır.
Önce bildirir ve para birimi tablosundaki bir imleç açar yordamı oluşturun.
USE AdventureWorks2012;
GO
IF OBJECT_ID ( 'dbo.uspCurrencyCursor', 'P' ) IS NOT NULL
DROP PROCEDURE dbo.uspCurrencyCursor;
GO
CREATE PROCEDURE dbo.uspCurrencyCursor
@CurrencyCursor CURSOR VARYING OUTPUT
AS
SET NOCOUNT ON;
SET @CurrencyCursor = CURSOR
FORWARD_ONLY STATIC FOR
SELECT CurrencyCode, Name
FROM Sales.Currency;
OPEN @CurrencyCursor;
GO
Sonra bir yerel imleç değişken bildirir, imleci yerel değişken atamak için yordamı çalıştırır ve sonra imleci satırları getirir toplu iş yürütme.
USE AdventureWorks2012;
GO
DECLARE @MyCursor CURSOR;
EXEC dbo.uspCurrencyCursor @CurrencyCursor = @MyCursor OUTPUT;
WHILE (@@FETCH_STATUS = 0)
BEGIN;
FETCH NEXT FROM @MyCursor;
END;
CLOSE @MyCursor;
DEALLOCATE @MyCursor;
GO
Dönüş kodu kullanarak veri döndürme
Bir yordam yordam yürütme durumunu gösteren bir kod adlı bir tamsayı değer döndürür. return deyimini kullanarak bir yordam dönüş kodunu belirtin. ÇIKIŞ parametreleri olarak, dönüş kodu değeri arama programı kullanabilmek için yordam çalıştırıldığında bir değişken dönüş kodu kaydetmelisiniz. Örneğin, atama değişken @resultveri türü intyordamı dönüş kodu saklamak için kullanılan my_proc, gibi:
DECLARE @result int;
EXECUTE @result = my_proc;
Dönüş kodları, her olası hata durum dönüş kodu değerini ayarlamak için sık denetim akış blokları prosedürler içinde kullanılır. @@ error işlevinin sonra kullanabileceğiniz bir Transact-SQLdeyimi yürütme sırasında bir hata olup olmadığını algılamak için deyimi.
Dönüş kodları örnekleri
Aşağıdaki örnekte gösterildiği usp_GetSalesYTDile çeşitli hatalar için özel dönüş kodu değerleri ayarlar hata işleme yordamı. Aşağıdaki tabloda, her olası hata ve ilgili anlamı her değer için yordam tarafından atanan tamsayı değerini gösterir.
Dönüş kodu değeri |
Anlamı |
---|---|
0 |
Başarılı yürütme. |
1 |
Gerekli parametre değeri belirtilmemiş. |
2 |
Belirtilen parametre değeri geçerli değil. |
3 |
Satış değeri alınırken hata oluştu. |
4 |
Satış temsilcisi için bulunan boş satış değeri. |
USE AdventureWorks2012;
GO
IF OBJECT_ID('Sales.usp_GetSalesYTD', 'P') IS NOT NULL
DROP PROCEDURE Sales.usp_GetSalesYTD;
GO
CREATE PROCEDURE Sales.usp_GetSalesYTD
@SalesPerson nvarchar(50) = NULL, -- NULL default value
@SalesYTD money = NULL OUTPUT
AS
-- Validate the @SalesPerson parameter.
IF @SalesPerson IS NULL
BEGIN
PRINT 'ERROR: You must specify a last name for the sales person.'
RETURN(1)
END
ELSE
BEGIN
-- Make sure the value is valid.
IF (SELECT COUNT(*) FROM HumanResources.vEmployee
WHERE LastName = @SalesPerson) = 0
RETURN(2)
END
-- Get the sales for the specified name and
-- assign it to the output parameter.
SELECT @SalesYTD = SalesYTD
FROM Sales.SalesPerson AS sp
JOIN HumanResources.vEmployee AS e ON e.BusinessEntityID = sp.BusinessEntityID
WHERE LastName = @SalesPerson;
-- Check for SQL Server errors.
IF @@ERROR <> 0
BEGIN
RETURN(3)
END
ELSE
BEGIN
-- Check to see if the ytd_sales value is NULL.
IF @SalesYTD IS NULL
RETURN(4)
ELSE
-- SUCCESS!!
RETURN(0)
END
-- Run the stored procedure without specifying an input value.
EXEC Sales.usp_GetSalesYTD;
GO
-- Run the stored procedure with an input value.
DECLARE @SalesYTDForSalesPerson money, @ret_code int;
-- Execute the procedure specifying a last name for the input parameter
-- and saving the output value in the variable @SalesYTD
EXECUTE Sales.usp_GetSalesYTD
N'Blythe', @SalesYTD = @SalesYTDForSalesPerson OUTPUT;
PRINT N'Year-to-date sales for this employee is ' +
CONVERT(varchar(10), @SalesYTDForSalesPerson);
Dan döndürülen dönüş kodları işlemek için bir programı aşağıdaki örnek oluşturur usp_GetSalesYTDyordam.
-- Declare the variables to receive the output value and return code
-- of the procedure.
DECLARE @SalesYTDForSalesPerson money, @ret_code int;
-- Execute the procedure with a title_id value
-- and save the output value and return code in variables.
EXECUTE @ret_code = Sales.usp_GetSalesYTD
N'Blythe', @SalesYTD = @SalesYTDForSalesPerson OUTPUT;
-- Check the return codes.
IF @ret_code = 0
BEGIN
PRINT 'Procedure executed successfully'
-- Display the value returned by the procedure.
PRINT 'Year-to-date sales for this employee is ' + CONVERT(varchar(10),@SalesYTDForSalesPerson)
END
ELSE IF @ret_code = 1
PRINT 'ERROR: You must specify a last name for the sales person.'
ELSE IF @ret_code = 2
PRINT 'EERROR: You must enter a valid last name for the sales person.'
ELSE IF @ret_code = 3
PRINT 'ERROR: An error occurred getting sales value.'
ELSE IF @ret_code = 4
PRINT 'ERROR: No sales recorded for this employee.'
GO
Ayrıca bkz.
Başvuru
DECLARE @local\_variable (Transact-SQL)
set @ local_variable (Transact-sql)