當前位置:首頁 » 編程語言 » sql函數和存儲過程例題
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql函數和存儲過程例題

發布時間: 2022-05-22 18:40:46

sql 存儲過程是怎麼實現的 簡單的例子和解釋!

存儲過程就是一組保存在資料庫中的sql語句,在需要的時候可以調用

最簡單的,比如

create procere test as
delete from t_1; ---刪除t_1表的所有記錄
在sql server查詢分析器執行時:

exec test; --執行過程test,刪除了表t_1的所有記錄

當然,沒有人這樣使用存儲過程,存儲過程可以接受參數,處理大量sql語句,並返回結果。
當在編寫軟體的過程中,碰到需要進行復雜的資料庫操作時,可能需要大量的sql語句,這時候可以先在資料庫中創建存儲過程,將sql語句都寫在存儲過程里,可以視情況加入參數,也可以返回處理結果。編寫軟體時,在適當的地方引用並執行這個存儲過程就好了,至於怎麼引用,不同的軟體開發語言有不同的語法。
存儲過程是預編譯的,這樣可以提高執行效率,對於軟體代碼的維護也有好處

❷ SQL2005 存儲過程調用存儲過程,求實例

Java調用SQL Server的存儲過程詳解

包含了如下幾部分

使用不帶參數的存儲過程
使用帶有輸入參數的存儲過程
使用帶有輸出參數的存儲過程
使用帶有返回狀態的存儲過程
使用帶有更新計數的存儲過程

1使用不帶參數的存儲過程

使用 JDBC 驅動程序調用不帶參數的存儲過程時,必須使用 call SQL 轉義序列。不帶參數的 call 轉義序列的語法如下所示:
{call procere-name}
作為實例,在 SQL Server 2005 AdventureWorks 示例資料庫中創建以下存儲過程:

SQL codeCREATE PROCEDURE GetContactFormalNames
AS
BEGIN
SELECT TOP 10 Title + ' ' + FirstName + ' ' + LastName AS FormalName
FROM Person.Contact
END

此存儲過程返回單個結果集,其中包含一列數據(由 Person.Contact 表中前十個聯系人的稱呼、名稱和姓氏組成)。

在下面的實例中,將向此函數傳遞 AdventureWorks 示例資料庫的打開連接,然後使用 executeQuery 方法調用 GetContactFormalNames 存儲過程。
Java codepublic static void executeSprocNoParams(Connection con) ...{
try ...{
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("{call dbo.GetContactFormalNames}");

while (rs.next()) ...{
System.out.println(rs.getString("FormalName"));
}
rs.close();
stmt.close();
}
catch (Exception e) ...{
e.printStackTrace();
}
}

2使用帶有輸入參數的存儲過程

使用 JDBC 驅動程序調用帶參數的存儲過程時,必須結合 SQLServerConnection 類的 prepareCall 方法使用 call SQL 轉義序列。帶有 IN 參數的 call 轉義序列的語法如下所示:
{call procere-name[([parameter][,[parameter]]...)]}

構造 call 轉義序列時,請使用 ?(問號)字元來指定 IN 參數。此字元充當要傳遞給該存儲過程的參數值的佔位符。可以使用 SQLServerPreparedStatement 類的 setter 方法之一為參數指定值。可使用的 setter 方法由 IN 參數的數據類型決定。
向 setter 方法傳遞值時,不僅需要指定要在參數中使用的實際值,還必須指定參數在存儲過程中的序數位置。例如,如果存儲過程包含單個 IN 參數,則其序數值為 1。如果存儲過程包含兩個參數,則第一個序數值為 1,第二個序數值為 2。
作為如何調用包含 IN 參數的存儲過程的實例,使用 SQL Server 2005 AdventureWorks 示例資料庫中的 uspGetEmployeeManagers 存儲過程。此存儲過程接受名為 EmployeeID 的單個輸入參數(它是一個整數值),然後基於指定的 EmployeeID 返回雇員及其經理的遞歸列表。下面是調用此存儲過程的 Java 代碼:

Java codepublic static void executeSprocInParams(Connection con) ...{
try ...{
PreparedStatement pstmt = con.prepareStatement("{call dbo.uspGetEmployeeManagers(?)}");
pstmt.setInt(1, 50);
ResultSet rs = pstmt.executeQuery();
while (rs.next()) ...{
System.out.println("EMPLOYEE:");
System.out.println(rs.getString("LastName") + ", " + rs.getString("FirstName"));
System.out.println("MANAGER:");
System.out.println(rs.getString("ManagerLastName") + ", " + rs.getString("ManagerFirstName"));
System.out.println();
}
rs.close();
pstmt.close();
}
catch (Exception e) ...{
e.printStackTrace();
}
}

3使用帶有輸出參數的存儲過程
使用 JDBC 驅動程序調用此類存儲過程時,必須結合 SQLServerConnection 類的 prepareCall 方法使用 call SQL 轉義序列。帶有 OUT 參數的 call 轉義序列的語法如下所示:
{call procere-name[([parameter][,[parameter]]...)]}

構造 call 轉義序列時,請使用 ?(問號)字元來指定 OUT 參數。此字元充當要從該存儲過程返回的參數值的佔位符。要為 OUT 參數指定值,必須在運行存儲過程前使用 SQLServerCallableStatement 類的 registerOutParameter 方法指定各參數的數據類型。

使用 registerOutParameter 方法為 OUT 參數指定的值必須是 Java.sql.Types 所包含的 JDBC 數據類型之一,而它又被映射成本地 SQL Server 數據類型之一。有關 JDBC 和 SQL Server 數據類型的詳細信息,請參閱了解 JDBC 驅動程序數據類型。

當您對於 OUT 參數向 registerOutParameter 方法傳遞一個值時,不僅必須指定要用於此參數的數據類型,而且必須在存儲過程中指定此參數的序號位置或此參數的名稱。例如,如果存儲過程包含單個 OUT 參數,則其序數值為 1;如果存儲過程包含兩個參數,則第一個序數值為 1,第二個序數值為 2。
作為實例,在 SQL Server 2005 AdventureWorks 示例資料庫中創建以下存儲過程: 根據指定的整數 IN 參數 (employeeID),該存儲過程也返回單個整數 OUT 參數 (managerID)。根據 HumanResources.Employee 表中包含的 EmployeeID,OUT 參數中返回的值為 ManagerID。

在下面的實例中,將向此函數傳遞 AdventureWorks 示例資料庫的打開連接,然後使用 execute 方法調用 GetImmediateManager 存儲過程:

Java codepublic static void executeStoredProcere(Connection con) ...{
try ...{
CallableStatement cstmt = con.prepareCall("{call dbo.GetImmediateManager(?, ?)}");
cstmt.setInt(1, 5);
cstmt.registerOutParameter(2, Java.sql.Types.INTEGER);
cstmt.execute();
System.out.println("MANAGER ID: " + cstmt.getInt(2));
}
catch (Exception e) ...{
e.printStackTrace();
}
}
本示例使用序號位置來標識參數。或者,也可以使用參數的名稱(而非其序號位置)來標識此參數。下面的代碼示例修改了上一個示例,以說明如何在 Java 應用程序中使用命名參數。請注意,這些參數名稱對應於存儲過程的定義中的參數名稱:
SQL code CREATE PROCEDURE GetImmediateManager
@employeeID INT,
@managerID INT OUTPUT
AS
BEGIN
SELECT @managerID = ManagerID
FROM HumanResources.Employee
WHERE EmployeeID = @employeeID
END

存儲過程可能返回更新計數和多個結果集。Microsoft SQL Server 2005 JDBC Driver 遵循 JDBC 3.0 規范,此規范規定在檢索 OUT 參數之前應檢索多個結果集和更新計數。也就是說,應用程序應先檢索所有 ResultSet 對象和更新計數,然後使用 CallableStatement.getter 方法檢索 OUT 參數。否則,當檢索 OUT 參數時,尚未檢索的 ResultSet 對象和更新計數將丟失。

4 使用帶有返回狀態的存儲過程

使用 JDBC 驅動程序調用這種存儲過程時,必須結合 SQLServerConnection 類的 prepareCall 方法使用 call SQL 轉義序列。返回狀態參數的 call 轉義序列的語法如下所示:
{[?=]call procere-name[([parameter][,[parameter]]...)]}

構造 call 轉義序列時,請使用 ?(問號)字元來指定返回狀態參數。此字元充當要從該存儲過程返回的參數值的佔位符。要為返回狀態參數指定值,必須在執行存儲過程前使用 SQLServerCallableStatement 類的 registerOutParameter 方法指定參數的數據類型。

此外,向 registerOutParameter 方法傳遞返回狀態參數值時,不僅需要指定要使用的參數的數據類型,還必須指定參數在存儲過程中的序數位置。對於返回狀態參數,其序數位置始終為 1,這是因為它始終是調用存儲過程時的第一個參數。盡管 SQLServerCallableStatement 類支持使用參數的名稱來指示特定參數,但您只能對返回狀態參數使用參數的序號位置編號。
作為實例,在 SQL Server 2005 AdventureWorks 示例資料庫中創建以下存儲過程:

SQL codeCREATE PROCEDURE CheckContactCity
(@cityName CHAR(50))
AS
BEGIN
IF ((SELECT COUNT(*)
FROM Person.Address
WHERE City = @cityName) > 1)
RETURN 1
ELSE
RETURN 0
END

該存儲過程返回狀態值 1 或 0,這取決於是否能在表 Person.Address 中找到 cityName 參數指定的城市。

在下面的實例中,將向此函數傳遞 AdventureWorks 示例資料庫的打開連接,然後使用 execute 方法調用 CheckContactCity 存儲過程:

Java codepublic static void executeStoredProcere(Connection con) ...{
try ...{
CallableStatement cstmt = con.prepareCall("{? = call dbo.CheckContactCity(?)}");
cstmt.registerOutParameter(1, Java.sql.Types.INTEGER);
cstmt.setString(2, "Atlanta");
cstmt.execute();
System.out.println("RETURN STATUS: " + cstmt.getInt(1));
}
cstmt.close();
catch (Exception e) ...{
e.printStackTrace();
}
}

5 使用帶有更新計數的存儲過程

使用 SQLServerCallableStatement 類構建對存儲過程的調用之後,可以使用 execute 或 executeUpdate 方法中的任意一個來調用此存儲過程。executeUpdate 方法將返回一個 int 值,該值包含受此存儲過程影響的行數,但 execute 方法不返回此值。如果使用 execute 方法,並且希望獲得受影響的行數計數,則可以在運行存儲過程後調用 getUpdateCount 方法。

作為實例,在 SQL Server 2005 AdventureWorks 示例資料庫中創建以下表和存儲過程:

SQL codeCREATE TABLE TestTable
(Col1 int IDENTITY,
Col2 varchar(50),
Col3 int);

CREATE PROCEDURE UpdateTestTable
@Col2 varchar(50),
@Col3 int
AS
BEGIN
UPDATE TestTable
SET Col2 = @Col2, Col3 = @Col3
END;
在下面的實例中,將向此函數傳遞 AdventureWorks 示例資料庫的打開連接,並使用 execute 方法調用 UpdateTestTable 存儲過程,然後使用 getUpdateCount 方法返回受存儲過程影響的行計數。
Java code public static void executeUpdateStoredProcere(Connection con) ...{
try ...{
CallableStatement cstmt = con.prepareCall("{call dbo.UpdateTestTable(?, ?)}");
cstmt.setString(1, "A");
cstmt.setInt(2, 100);
cstmt.execute();
int count = cstmt.getUpdateCount();
cstmt.close();

System.out.println("ROWS AFFECTED: " + count);
}
catch (Exception e) ...{
e.printStackTrace();
}
}

希望可以幫到樓主,望採納!

❸ 求解:SQL存儲過程題

create procere uspCreateBillDispense(
@billType VARCHAR(50), --票據類型
@billStartCode VARCHAR(50), --票據開始號
@billEndCode VARCHAR(50), --票據結束號
@receiveBillPerson VARCHAR(50), --領票人
@acceptStation VARCHAR(50), --接貨點
@receiveBillTime DATETIME, --領票時間
@releasePerson VARCHAR(50), --分發人
@PKID INT OUTPUT --票據ID
)
as
begin tran --加事務控制
insert into BillMgt_BillDispense(
,billType
,billStartCode
,billEndCode
,receiveBillPerson
,acceptStation
,receiveBillTime
,releasePerson
)
values(@billType
,dbo.funGenerateBillCode(@billType,@billStartCode,@receiveBillTime) --函數直接用
,dbo.funGenerateBillCode(@billType,@billEndCode,@receiveBillTime) --函數直接用
,@receiveBillPerson
,@acceptStation
,@receiveBillTime
,@releasePerson
)

set @PKID=Scope_identity()-- 獲取自增列

if @@error<>0
goto error

commit tran
return 0
error:
rollback tran
return 1
go

--調用
declare @flag int,--判斷是否成功新增數據
@billType VARCHAR(50), --票據類型
@billStartCode VARCHAR(50), --票據開始號
@billEndCode VARCHAR(50), --票據結束號
@receiveBillPerson VARCHAR(50), --領票人
@acceptStation VARCHAR(50), --接貨點
@receiveBillTime DATETIME, --領票時間
@releasePerson VARCHAR(50),
@PKID INT

exec @flag=uspCreateBillDispense
@billType =1 , --票據類型
@billStartCode='1' , --票據開始號
@billEndCode='2' , --票據結束號
@receiveBillPerson='1' , --領票人
@acceptStation '2', --接貨點
@receiveBillTime='2009-07-01' , --領票時間
@releasePerson='a',
@PKID output -- 獲取自增列

if @flag=0--這里程序可自定義判斷
select @flag,@PKID

❹ sql的創建執行存儲過程那些題目,高手幫忙,我送100分

可以根據這個寫很簡單的列子很容易看懂改變參數類型和查詢語句就可了
----存儲過程的創建(必須打開相應的資料庫)
---1實現兩數字相加
----1無慘無返回值
create proc proc_add1
--無參
as
declare @n1 int ,@n2 int ,@sum int
set @n1=10
set @n2=5
set @sum=@n1+@n2
print '兩數的和'+convert(varchar(10),@sum)
---調用
exec proc_add1

---1實現兩數字相加
----2無慘有返回值
create proc proc_add2
--無參
as
declare @n1 int ,@n2 int ,@sum int
set @n1=10
set @n2=5
set @sum=@n1+@n2
return @sum

---調用
declare @n int
exec @n=proc_add2
print '兩數的和'+convert(varchar(10),@n)

---1實現兩數字相加
----3有慘無返回值
create proc proc_add3
@n1 int,
@n2 int
as
declare @sum int
set @sum=@n1+@n2
print '兩數的和'+convert(varchar(10),@sum)

---調用
exec proc_add3 10,5

---1實現兩數字相加
----4有慘有返回值
create proc proc_add4
@n1 int,
@n2 int
as
declare @sum int
set @sum=@n1+@n2
return @sum

---調用
declare @n int
exec @n =proc_add4 10,5 --一個蘿卜一個坑
print '兩數的和'+convert(varchar(10),@n)

❺ SQL資料庫的例題請教一下大家

看了你的題,首先幾個表需要說明一下Out_Goods和In_Goods在定義表時少了Sh_address列,列的屬性參考Provider表中的Address

問題解答:
問題1、自定義一個函數,計算供貨商編號為PD001所提供產品的平均價格,如果平均價格〉70,則輸出「價格適中」;如果平均價格<=70,則輸出價格較低。
CREATE FUNCTION [dbo].[fn_calc_avg_price]
(
@PID char(10) = 'PD001'-----------貨商編號,此處默認值為PD001
)

RETURNS varchar(50) AS

BEGIN
DECLARE @vchPriceDesc varchar(50)
DECLARE @mnyPriceAvg money

SELECT @mnyPriceAvg = AVG(PPrice)
FROM Proct WHERE PID = @PID

IF (@mnyPriceAvg > 70) SET @vchPriceDesc = '價格適中'
IF (@mnyPriceAvg <= 70) SET @vchPriceDesc = '價格較低'

RETURN @vchPriceDesc
END

問題2、創建一個內聯表值函數,返回一個時間段內的出貨信息,要求包括出貨商品名稱、供貨商名稱、出貨價格、出貨數量、出貨日期。
CREATE FUNCTION [dbo].[fn_get_out_goods_info]
(
@dtBeginTime datetime, --------------------------時間段的起始時間
@dtEndTime datetime --------------------------時間段的終止時間
)

RETURNS @TempTable table
(
out_proct_name varchar(20),
out_provider_name varchar(20),
out_proct_price money,
out_proct_num int,
out_date datetime
)
AS

BEGIN
INSERT INTO @TempTable
SELECT
Proct.PName,
Provider.ProviderName,
Out_Goods.OutPrice,
Out_Goods.OutNum,
Out_Goods.OutDate
FROM
Proct, Provider, Out_Goods
WHERE
Provider.ProviderId = Out_Goods.ProviderId
AND Proct.PId = Out_Goods.PId
AND Out_Goods.OutDate <= @dtEndTime
AND Out_Goods.OutDate >= @dtBeginTime
RETURN
END

問題3、創建一個after觸發器,當Provider 供貨商信息表中的ProviderId發生更改時,同時更改In_Goods進貨信息表和Out_Goods出貨信息表ProviderId欄位的值。
CREATE TRIGGER [trig_update_proID]
ON [dbo].[Provider]
AFTER UPDATE

AS

IF UPDATE(ProviderID)
BEGIN
UPDATE In_Goods SET ProviderID = (SELECT ProviderID FROM INSERTED) WHERE ProviderID = (SELECT ProviderID FROM DELETED)
UPDATE Out_Goods SET ProviderID = (SELECT ProviderID FROM INSERTED) WHERE ProviderID = (SELECT ProviderID FROM DELETED)
END

問題4、定義一個存儲過程,要求使用游標,計算某段時間內售出產品的平均價格。

坦白的說,其實沒必要使用游標,既然用了,那就順便用下WHILE循環好了
CREATE PROCEDURE [dbo].[sp_calc_part_sales_price]
(
@dtBeginTime datetime,
@dtEndTime datetime
)
AS

DECLARE @mnyTotalPrice money
DECLARE @mnyCurPrice money
DECLARE @nCount int SELECT @nCount = 0

DECLARE cursPrice CURSOR LOCAL
FOR SELECT OutPrice FROM Out_Goods WHERE Out_Goods.OutDate <= @dtEndTime AND Out_Goods.OutDate >= @dtBeginTime

OPEN cursPrice
FETCH NEXT FROM cursPrice INTO @mnyCurPrice

WHILE @@FETCH_STATUS=0
BEGIN
SET @nCount = @nCount + 1
SET @mnyTotalPrice = @mnyTotalPrice + @mnyCurPrice
FETCH NEXT FROM cursPrice INTO @mnyCurPrice
END

IF @nCount = 0 SELECT 0 AS '平均價格'
IF @nCount > 0 SELECT @mnyTotalPrice/@nCount AS '平均價格'

OK,就這樣吧,如果有不明白或者我寫錯的地方,再聯系,Good Luck!

❻ 用SQL創建存儲過程的題目(SQL SERVER2000下)

關於delphi調用存儲過程,用sql
server自帶的「創建存儲過程向導」給表login建立一個更新存儲過程。
懸賞分:100
|
離問題結束還有
12

18
小時
|
提問者:風風我依
|
檢舉
存儲過程代碼如下:已知表login有passname和password兩個欄位。
create
procere
[update_login_1]
(@passname_1
[varchar],
@passname_2
[varchar](50),
@password_3
[varchar](50))
as
update
[wqzx].[dbo].[login]
set
[passname]
=
@passname_2,
[password]
=
@password_3
where
(
[passname]
=
@passname_1)
go
-------------------------------------------------------------------------------------
在delp調用該存儲過程,要求只該改欄位中的password,即建一個文本框將裡面內容替換一個記錄中的password,而保持passname不變,簡單講就是修改一個用戶名的密碼。怎麼寫代碼?問題補充:
"強唐華"我試過這樣寫存儲過程了,沒用的,如果可以,那在delphi中怎麼寫代碼調用這個存儲過程?
強調下:這是sql自帶建立的存儲過程,就是由「創建存儲過程向導」生成,我覺得不會錯的,問題是怎麼在delphi中調用該存儲過程,代碼呢?
我建立了一個插入的存儲過程,代碼如下:
with
storedproc1
do
begin
parambyname('@passname_1').asstring:=edit1.text;
parambyname('@password_2').asstring:=edit2.text;
execproc;
if
params[0].asinteger=0
then
messagedlg('添加新用戶名成功!',mtinformation,[mbok],0)
else
messagedlg('添加用戶失敗!',mterror,[mbok],0);
end;
這段代碼是可以成功插入一個記錄的。現在是想修改某個記錄。
回答
共1條
create
procere
[dbo].[update_login]
(@name
varchar(50),
@password
[varchar](50))
as
update
useres
set
password=@password
where
name=
@name
這么簡單的存儲過程,都不會用?
sqlconnection
conn
=
new
sqlconnection("data
source=tq-pc;initial
catalog=tq;user
id=sa;password=123");
sqlcommand
cmd
=
new
sqlcommand("update_login",
conn);
cmd.commandtype
=
commandtype.storedprocere;
cmd.parameters.addwithvalue("@name",
textbox3.text.trim());
cmd.parameters.addwithvalue("@password",
textbox4.text.trim());
conn.open();
int
i
=
cmd.executenonquery();
if
(i
>
0)
response.write("密碼修改成功!");
else
response.write("密碼修改失敗!");

❼ SQL Server 的函數與存儲過程

1.
函數結構:架構+函數名稱
2.
所以一般在存儲過程都可以直接調用,如下sql:
3.
假如函數test,參數為字元串類型
4.
select
dbo.test('123')
5.
存儲過程調用也是以上格式一樣,

❽ 哪個有pl/sql函數和存儲過程的練習題不

select 部門編號、部門、員工ID、員工姓名、考勤日期,sum(decode(考勤情況,turn,0,1)) over (partition by 部門) from 張考勤表 where 考勤日期 between trunc(sysdate,'month') and trunc(sysdate,'month')+10;

❾ sql資料庫的存儲過程的函數問題

1)自定義函數中不能調用存儲過程,如果調用了,函數可以順利創建,但是調用函數會出錯
2)自定義函數中不能創建表,刪除表,插入表數據
解決辦法:
可以先把存儲過程返回的結果插入到臨時表,然後在函數里調用臨時表,或者運用內置函數,或者使用復雜的聯合查詢實現想要的結果

❿ 請用SQL語句或存儲過程完成以下題目

write("SCORE=0")

呵呵,開玩笑!不過LZ也太省事了吧