A. PL/SQL建好存儲過程,編譯也成功了,但是用execute執行的的 提示許可權不足(ora-01031)
用你有dba許可權的用戶執行這個試試。
;
如果還報錯就要看代碼了。
B. 如何判斷存儲過程執行成功
這個分兩種情況:
由於存儲過程是資料庫自身的東西,JAVA只是調用
所以,如果是語法上的錯誤 sql直接不能執行 , JAVA確實能接收到異常
但是如果語法沒有錯誤, 只是你寫的條件錯了, sql能執行,只是沒有得到你想要的效果, 這個情況, 是判斷不了的, 都會視為成功執行
如果 sql = "select from aaa where id > 10" 這直接是語法 錯誤,肯定報錯
但 如果 sql = "update aaa set name = 'aaa' where id='123' "; 沒有語法 錯誤 ,能執行, 只是沒有id = 123的數據, 你要改124的,錯寫成123了, 就修改不了, 但也不會報任何錯
C. 存儲過程經過編譯保存在資料庫中這句話對嗎
這句話沒有問題啊
存儲過程在創建時就在資料庫伺服器上進行了編譯並存儲在資料庫中了,存儲過程運行要比單個的SQL語句塊要快。並且在調用時只需要提供存儲過程名和必要的參數信息,所以在一定程度上也可以減少網路流量、減輕網路負擔。所以在項目中會選擇將一些復雜的sql業務邏輯轉用存儲過程來實現以提高系統的性能
D. 如何知道存儲過程是否編譯成功
直接執行 你的存儲過程 沒有報錯
就行了
E. 存儲過程到底是什麼!
在大型資料庫系統中,存儲過程和觸發器具有很重要的作用。無論是存儲過程還是觸發器,都是sql 語句和流程式控制制語句的集合。就
本質而言,觸發器也是一種存儲過程。存儲過程在運算時生成執行方式,所以,以後對其再運行時其執行速度很快。sql server 2000 不僅提供了用戶自定義存儲過程的功能,而且也提供了許多可作為工具使用的系統存儲過程。
12.1.1 存儲過程的概念
存儲過程(stored procere)是一組為了完成特定功能的sql 語句集,經編譯後存儲在資料庫。中用戶通過指定存儲過程的名字並給出參數(如果該存儲過程帶有參數)來執行它。
在sql server 的系列版本中存儲過程分為兩類:系統提供的存儲過程和用戶自定義存儲過程。系統過程主要存儲在master 資料庫中並以sp_為前綴,並且系統存儲過程主要是從系統表中獲取信息,從而為系統管理員管理sql server 提供支持。通過系統存儲過程,ms sql server 中的許多管理性或信息性的活動(如了解資料庫對象、資料庫信息)都可以被順利有效地完成。盡管這些系統存儲過程被放在master 資料庫中,但是仍可以在其它資料庫中對其進行調用,在調用時不必在存儲過程名前加上資料庫名。而且當創建一個新資料庫時,一些系統存儲過程會在新資料庫中被自動創建。用戶自定義存儲過程是由用戶創建並能完成某一特定功能(如查詢用戶所需數據信息)的存儲過程。在本章中所涉及到的存儲過程主要是指用戶自定義存儲過程。
12.1.2 存儲過程的優點
當利用ms sql server 創建一個應用程序時,transaction-sql 是一種主要的編程語言。若運用transaction-sql 來進行編程,有兩種方法。其一是,在本地存儲transaction- sql 程序,並創建應用程序向sql server 發送命令來對結果進行處理。其二是,可以把部分用transaction-sql 編寫的程序作為存儲過程存儲在sql server 中,並創建應用程序來調用存儲過程,對數據結果進行處理存儲過程能夠通過接收參數向調用者返回結果集,結果集的格式由調用者確定;返回狀態值給調用者,指明調用是成功或是失敗;包括針對資料庫的操作語句,並且可以在一個存儲過程中調用另一存儲過程。
我們通常更偏愛於使用第二種方法,即在sql server 中使用存儲過程而不是在客戶計算機上調用transaction-sql 編寫的一段程序,原因在於存儲過程具有以下優點:
(1) 存儲過程允許標准組件式編程
存儲過程在被創建以後可以在程序中被多次調用,而不必重新編寫該存儲過程的sql 語句。而且資料庫專業人員可隨時對存儲過程進行修改,但對應用程序源代碼毫無影響(因為應用程序源代碼只包含存儲過程的調用語句),從而極大地提高了程序的可移植性。
(2) 存儲過程能夠實現較快的執行速度
如果某一操作包含大量的transaction-sql 代碼或分別被多次執行,那麼存儲過程要比批處理的執行速度快很多。因為存儲過程是預編譯的,在首次運行一個存儲過程時,查詢優化器對其進行分析、優化,並給出最終被存在系統表中的執行計劃。而批處理的transaction- sql 語句在每次運行時都要進行編譯和優化,因此速度相對要慢一些。
(3) 存儲過程能夠減少網路流量
對於同一個針對數據資料庫對象的操作(如查詢、修改),如果這一操作所涉及到的 transaction-sql 語句被組織成一存儲過程,那麼當在客戶計算機上調用該存儲過程時,網路中傳送的只是該調用語句,否則將是多條sql 語句,從而大大增加了網路流量,降低網路負載。
(4) 存儲過程可被作為一種安全機制來充分利用
系統管理員通過對執行某一存儲過程的許可權進行限制,從而能夠實現對相應的數據訪問許可權的限制,避免非授權用戶對數據的訪問,保證數據的安全。(我們將在14 章「sqlserver 的用戶和安全性管理」中對存儲過程的這一應用作更為清晰的介紹)
注意:存儲過程雖然既有參數又有返回值,但是它與函數不同。存儲過程的返回值只是指明執行是否成功,並且它不能像函數那樣被直接調用,也就是在調用存儲過程時,在存儲過程名字前一定要有exec保留字(如何執行存儲過程見本章下一字)。
F. 存儲過程一直報錯 但是編譯成功了 也沒有錯 調用時一直不成功報錯
下面是問題:
Oraclede 環境中,客戶那邊提出,執行存儲過程時出錯,信息:DBCustomException: ORA-00900: invalid SQL statement
關於這個問題之前也遇到過,一直找不到原因,沒解決,時好時壞,,由於客戶大部分是SQL Server,也就沒太在意,現在終於麻煩來了。
我用自己創建的用戶,通過P/L SQL 登陸,執行以下語句
--創建表
create table ttt
(
aa varchar(20)
)
--創建存儲過程
CREATE OR REPLACE PROCEDURE myproc
AS BEGIN
select * from ttt;
END
--執行
exec myproc
執行存儲過程時,開始報錯:ORA-00900:無效SQL語句 (上面那個錯誤的中文版-_-!)
這時候看右邊的存儲過程如下,有個紅叉,
G. 這個存儲過程哪兒犯錯了,編譯成功了,但執行不來,Test也沒報錯
你把 if startdate is not null and enddate is not null then 這句改了 改成
if (length(startdate) != 0) and (length(enddate) != 0) then
H. sql存儲過程只編譯一次是個什麼概念
存儲過程執行成功後,會保留在資料庫中,下次再調用時不必再重新執行,直接調用即可。
I. oracle存儲過程提示編譯完成但存在錯誤,如何查看錯誤
1、首先打開PL/SQL Developer軟體,新建sql窗口。