sqlquery存儲過程
你在存儲過程中調用了本身這個存儲過程(這就是嵌套調用),而且未加任何條件限制, 類似於一直調用此存儲過程,造成死循環調用。而資料庫為了避免這樣的調用,只允許嵌套執行32次,超出就發生異常。
所以,請不要進行這樣的嵌套調用(就是不要在存儲過程中調用自己),或者添加調用條件。
2. 怎麼導入sql2005存儲過程我新建一個存儲過程當我保存時到桌面,SQLQuery14.sql怎麼導入啊在哪導入
上面的那個保存按鈕是將存儲過程保存到磁碟上的。
存儲過程你直接創建的話執行完了就新建成功了。
CREATE PROCEDURE 存儲過程名 這個是創建存儲過程
ALTER PROCEDURE 存儲過程名 這個是修改存儲過程
3. Hibernate調用存儲過程,使用SQLQuery的方式,請問如果返回參數是CURSOR,怎麼寫呢
我使用的oracle
proc.registerOutParameter(2, OracleTypes.CURSOR);
不過第一個數好像是從1開始的吧
4. sql server 存儲過程,怎麼寫
第一次寫還弄這么復雜的,還使用到了,SQL字元串的拼接,一般來說,即使是有SQL經驗的人寫拼接字元串也很難一次性寫正確,經常出現拼接語法錯誤,建議你初學還是找個簡單點的例子看吧。
另外, alter 是修改存儲過程 ,創建一個不存在的存儲過程用 create ,sql自帶的幫助教程你可以去看看,比你看這個例子簡單多了。。。
5. sql 存儲過程 概念
枯燥雜亂的網文不給你轉了,用我自己的詞彙給你組織一下這個概念吧:
你可以把存儲過程當做:把一系列語句合並到一起的這么一個整體
我覺得舉例說明比較好,給你個例子:
先將【表1】中ID號為50—2000的記錄刪除、
再將【表2】中的這些記錄的狀態(STATUS)改為「已解除」:
delete 表1 where ID > 50 and ID < 2000
update 表2 set STATUS = '已解除' where ID > 50 and ID < 2000
正常情況下,以上兩條語句分步執行就可以了,如果要用存儲過程呢?
先建立存儲過程(以下的語法為Sybase資料庫的,其他資料庫類同):
create procere PRC_TEST (@start_ID int, @end_ID int)
as
begin
delete 表1 where ID > @start_ID and ID < @end_ID
update 表2 set STATUS = '已解除' where ID > @start_ID and ID < @end_ID
end
好了,執行這個語句,就將存儲過程PRC_TEST提交到資料庫里了,它有兩個參數:start_ID int 和 end_ID,代表起始和終止ID號,類型為整數型int
怎麼用這個存儲過程呢? 這樣執行:exc PRC_TEST 50, 2000
執行時,它先得到了兩個參數,50、2000,分別賦值給start_ID int 和 end_ID,然後按照這兩個參數分步執行封裝在存儲過程里的那兩條語句了。
如果你這樣執行:exc PRC_TEST 220, 8660
就是處理兩個表中ID介於220—8660之間的記錄了。
----------------------------------------------------------------------------
你也許會問了,既然可以分步執行的幾句SQL,為什麼要費力的寫成存儲過程啊?
主要是(我的經驗和認識):
1、使數據處理參數化,對經常使用的一系列SQL進行封裝,使其成為一個存儲過程的整體,在每次執行時只要更換執行參數即可,不用去改裡面每句SQL的where子句
2、★★這個很重要★★,假設你要循環處理某些數據,例如需要使用「游標」、「Do...while...語句」…………時,就要用到存儲過程(或觸發器)
=====================================================================
最後給你轉一個短文吧,這是書面上的概念:
將常用的或很復雜的工作,預先用SQL語句寫好並用一個指定的名稱存儲起來, 那麼以後要叫資料庫提供與已定義好的存儲過程的功能相同的服務時,只需調用execute,即可自動完成命令。
那麼存儲過程與一般的SQL語句有什麼區別呢?
存儲過程的優點:
1.存儲過程只在創造時進行編譯,以後每次執行存儲過程都不需再重新編譯,而一般SQL語句每執行一次就編譯一次,所以使用存儲過程可提高資料庫執行速度。
2.當對資料庫進行復雜操作時(如對多個表進行Update,Insert,Query,Delete時),可將此復雜操作用存儲過程封裝起來與資料庫提供的事務處理結合一起使用。
3.存儲過程可以重復使用,可減少資料庫開發人員的工作量
4.安全性高,可設定只有某此用戶才具有對指定存儲過程的使用權
存儲過程的種類:
1.系統存儲過程:以prc_(或sp_)開頭,用來進行系統的各項設定.取得信息.相關管理工作,
如 sp_help就是取得指定對象的相關信息
2.擴展存儲過程 以XP_開頭,用來調用操作系統提供的功能
exec master..xp_cmdshell 'ping 10.8.16.1'
3.用戶自定義的存儲過程,這是我們所指的存儲過程
6. sqlserver存儲過程怎麼調試
SQL Server存儲過程相信大家都接觸過,下面就教您如何實現SQL Server存儲過程的單步調試,希望可以讓您對SQL Server存儲過程有更深的認識。
1)調試
在SQL Server的SQL Query Analyzer(查詢分析器)中,打開Object Brower(F8),在左邊的列表中選擇一資料庫,展開Stored Proceres,然後選擇要調試的存儲過程(或任意一個存儲過程),按右鍵,點擊「Debug」,則彈出Debug Procere對話框,顯示該存儲過程的參數(可在Proceres列表中選擇其他要調試的存儲過程),為參數輸入初始值,點擊「Execute」按鈕,進入Debug窗口;可使用上面一排按鈕或其對應的快捷鍵對該存儲過程進行「執行」「設斷點」「取消斷點」「單步跟蹤」等操作;窗口下方是參數列表,第一個是自定義參數變數列表,在Debug的過程中顯示全局變數和局部變數的值的變化,可對參數列表中該存儲過程的參數初值進行修改,再重新調試;第二個列表是系統變數,可自行增加,如添加「@@Error」「@@RowCount」,觀看其值的變化,其值不能手工修改。第三個列表是CallStack,暫時不知道怎麼用。在參數列表中,不能直接把User_Name()、GetDate()等函數直接放到參數列表中跟蹤,要把它們賦值予自定義變數進行查看。
大家可連接Pivot的SQL Server進行嘗試,使用本機DB系統如果不行,則需要用Administrator登錄本機,然後在企業管理器中,在本機的SQL Server Registration上點擊右鍵,點「屬性」,選擇「Security」,選擇「This account」,輸入Administrator和密碼,確定之。
2)SQL Server存儲過程單步調試
具體步驟如下:
1、將伺服器【身份驗證】屬性設置成【混合模式】(window與sql身份驗證)
2、在【控制面板】中打開【服務】將【MSSQLSERVER】服務打開【屬性】,選擇【登錄】頁面,將登錄身份設置成伺服器本地帳號和該帳號密碼,如administrator,密碼123;
3、重新啟動sqlserver服務,此時的服務指的是【SQL服務管理器】中的SQL SERVER服務;
假設【帳號】設置為administrator
此時達到的效果是:伺服器本地帳號administrator與客戶端上的administrator(並且該帳號的密碼要與伺服器密碼相同)可以通過【查詢分析器】進行調試;
如果想讓【其他帳號】也能夠調試,那麼還需要如下設置:
1、在【伺服器】上運行dcomcnfg.exe;
2、在【默認安全機制】中【默認訪問許可權】右邊點擊【編輯默認值】選擇允許調試的帳號類型,如users用戶類型,sample帳號有包含users組;
3、重新啟動sqlserver服務;
3、在客戶端上創建與服務帳號密碼一樣的用戶,如sample;
做到這步就可以通過查詢分析器的調試功能進行單步調試了
7. sql存儲過程的優點
1.存儲過程可以使得程序執行效率更高、安全性更好,因為過程建立之後
已經編譯並且儲存到資料庫,直接寫sql就需要先分析再執行因此過程效率更高,直接寫sql語句會帶來安全性問題,如:sql注入
2.建立過程不會很耗系統資源,因為過程只是在調用才執行。
3.如果我表book更新了
存儲過程是不是要重新遍歷一下表?不會,如果有需要根據book表更新而更新可考慮建立觸發器在特定條件觸發,如:insert,update,delete語法如下:
create
trigger
tr_book
on
book
for
insert,update,delete
as
begin
...
end
補充回答:數據量越大執行過程越長.如是幾十條幾或幾K可能看不出效果如果是上10W或者過100W你就會發現速度(查詢、更新)會慢很多,,隨著數據量增大你的存儲過程執行時間會更長是一定的
8. 簡單sql存儲過程實例、儲過程實戰
實例1:只返回單一記錄集的存儲過程。
銀行存款表(bankMoney)的內容如下
Id
userID
Sex
Money
001
Zhangsan
男
30
002
Wangwu
男
50
003
Zhangsan
男
40
要求1:查詢表bankMoney的內容的存儲過程
create
procere
sp_query_bankMoney
as
select
*
from
bankMoney
go
exec
sp_query_bankMoney
注*
在使用過程中只需要把中的SQL語句替換為存儲過程名,就可以了很方便吧!
實例2(向存儲過程中傳遞參數):
加入一筆記錄到表bankMoney,並查詢此表中userID=
Zhangsan的所有存款的總金額。
Create
proc
insert_bank
@param1
char(10),@param2
varchar(20),@param3
varchar(20),@param4
int,@param5
int
output
with
encryption
---------加密
as
insert
bankMoney
(id,userID,sex,Money)
Values(@param1,@param2,@param3,
@param4)
select
@param5=sum(Money)
from
bankMoney
where
userID='Zhangsan'
go
在SQL
Server查詢分析器中執行該存儲過程的方法是:
declare
@total_price
int
exec
insert_bank
'004','Zhangsan','男',100,@total_price
output
print
'總余額為'+convert(varchar,@total_price)
go
在這里再啰嗦一下存儲過程的3種傳回值(方便正在看這個例子的朋友不用再去查看語法內容):
1.以Return傳回整數
2.以output格式傳回參數
3.Recordset
傳回值的區別:
output和return都可在批次程式中用變數接收,而recordset則傳回到執行批次的客戶端中。
實例3:使用帶有復雜
SELECT
語句的簡單過程
下面的存儲過程從四個表的聯接中返回所有作者(提供了姓名)、出版的書籍以及出版社。該存儲過程不使用任何參數。
USE
pubs
IF
EXISTS
(SELECT
name
FROM
sysobjects
WHERE
name
=
'au_info_all'
AND
type
=
'P')
DROP
PROCEDURE
au_info_all
GO
CREATE
PROCEDURE
au_info_all
AS
SELECT
au_lname,
au_fname,
title,
pub_name
FROM
authors
a
INNER
JOIN
titleauthor
ta
ON
a.au_id
=
ta.au_id
INNER
JOIN
titles
t
ON
t.title_id
=
ta.title_id
INNER
JOIN
publishers
p
ON
t.pub_id
=
p.pub_id
GO
au_info_all
存儲過程可以通過以下方法執行:
EXECUTE
au_info_all
實例4:使用帶有參數的簡單過程
CREATE
PROCEDURE
au_info
@lastname
varchar(40),
@firstname
varchar(20)
AS
SELECT
au_lname,
au_fname,
title,
pub_name
FROM
authors
a
INNER
JOIN
titleauthor
ta
ON
a.au_id
=
ta.au_id
INNER
JOIN
titles
t
ON
t.title_id
=
ta.title_id
INNER
JOIN
publishers
p
ON
t.pub_id
=
p.pub_id
WHERE
au_fname
=
@firstname
AND
au_lname
=
@lastname
GO
au_info
存儲過程可以通過以下方法執行:
EXECUTE
au_info
'Dull',
'Ann'
--
Or
EXECUTE
au_info
@lastname
=
'Dull',
@firstname
=
'Ann'
--
Or
EXECUTE
au_info
@firstname
=
'Ann',
@lastname
=
'Dull'
實例5:使用帶有通配符參數的簡單過程
CREATE
PROCEDURE
au_info2
@lastname
varchar(30)
=
'D%',
@firstname
varchar(18)
=
'%'
AS
SELECT
au_lname,
au_fname,
title,
pub_name
FROM
authors
a
INNER
JOIN
titleauthor
ta
ON
a.au_id
=
ta.au_id
INNER
JOIN
titles
t
ON
t.title_id
=
ta.title_id
INNER
JOIN
publishers
p
ON
t.pub_id
=
p.pub_id
WHERE
au_fname
LIKE
@firstname
AND
au_lname
LIKE
@lastname
GO
au_info2
存儲過程可以用多種組合執行。下面只列出了部分組合:
EXECUTE
au_info2
--
Or
EXECUTE
au_info2
'Wh%'
--
Or
EXECUTE
au_info2
@firstname
=
'A%'
--
Or
EXECUTE
au_info2
'[CK]ars[OE]n'
--
Or
EXECUTE
au_info2
'Hunter',
'Sheryl'
--
Or
EXECUTE
au_info2
'H%',
'S%'
9. 什麼是存儲過程有什麼優點
存儲過程是事先經過編譯並存儲在資料庫中的一段SQL語句的集合,調用存儲過程可以簡化應用開發人員的很多工作,減少數據在資料庫和應用伺服器之間的傳輸,對於提高數據處理的效率是有好處的。
優點:
1、重復使用:存儲過程可以重復使用,從而可以減少資料庫開發人員的工作量。
2、減少網路流量:存儲過程位於伺服器上,調用的時候只需要傳遞存儲過程的名稱以及參數就可以了,因此降低了網路傳輸的數據量。
3、安全性:參數化的存儲過程可以防止SQL注入式攻擊,而且可以將Grant、Deny以及Revoke許可權應用於存儲過程。
(9)sqlquery存儲過程擴展閱讀:
存儲過程的缺點:
1、更改比較繁瑣:如果更改范圍大到需要對輸入存儲過程的參數進行更改,或者要更改由其返回的數據,則仍需要更新程序集中的代碼以添加參數、更新 GetValue() 調用,等等,這時候估計比較繁瑣。
2、可移植性差:由於存儲過程將應用程序綁定到 SQL Server,因此使用存儲過程封裝業務邏輯將限制應用程序的可移植性。如果應用程序的可移植性在您的環境中非常重要,則需要將業務邏輯封裝在不特定於 RDBMS 的中間層中。
10. 使用query控制項怎麼調用存儲過程
過程如下:
public Boolean doInHibernate(Session session)
throws HibernateException, SQLException {
try{
Transaction tr = session.beginTransaction();
SQLQuery query = session.createSQLQuery("{call CommandAdapter(?,?,?,?)}");
query.setString(0,"ls");
query.setInteger(1, machineid);
query.setString(2, param);
query.setInteger(3, 0); //
query.executeUpdate();
tr.commit();
return true;
}catch(Exception e){
e.printStackTrace();
return false;
}finally{
session.close();
}
}
使用hibernate調用帶參數返回值的存儲過程方法
在調用帶參數返回值的方法時,需使用到CallableStatement對象。因此,首先得設法獲取一個Connection。
獲取Connection 方法:
(1)session.connection();//此方法目前已被棄用
(2)SessionFactoryUtils.getDataSource(sessionFactory).getConnection()
不
過我在使用SessionFactoryUtils.getDataSource(sessionFactory)時,一直獲取的都是空值,為此參考
SessionFactoryUtils的源代碼直接利用ConnectionProvider對象來獲取一個Connection實例。
完整代碼:
SessionFactory sessionFactory=this.getSessionFactory();
if (sessionFactory instanceof SessionFactoryImplementor){
ConnectionProvider cp = ((SessionFactoryImplementor) sessionFactory).getConnectionProvider();
try {
CallableStatement statement = cp.getConnection().prepareCall(
"{call MachineDataQuery(?,?,?,?,?,?,?,?,?,?,?,?,?,?)}");
statement.setInt(1, machineId);
statement.setInt(2, jobId);
statement.setInt(3, partTypeId);
statement.setInt(4, compentId);
statement.setInt(5, opId);
statement.setInt(6, roleId);
statement.setInt(7, userId);
statement.setString(8, sd);
statement.setString(9, ed);
statement.registerOutParameter(10, Types.FLOAT);
statement.registerOutParameter(11, Types.FLOAT);
statement.registerOutParameter(12, Types.FLOAT);
statement.registerOutParameter(13, Types.FLOAT);
statement.registerOutParameter(14, Types.FLOAT);
statement.execute();
System.out.println(statement.getFloat(10));
System.out.println(statement.getFloat(11));
System.out.println(statement.getFloat(12));
System.out.println(statement.getFloat(13));
System.out.println(statement.getFloat(14));
} catch (SQLException e) {
e.printStackTrace();
}finally{
cp.close();
}
}
ps:切記存儲過程中不可有多餘的print或select語句,否則會拋出異常「com.microsoft.sqlserver.jdbc.SQLServerException: 已生成用於更新的結果集。」