sql異常處理
如果說還可以創建資料庫。只是某個資料庫出現可疑,那就是我說的那兩個文件被刪或者移除追問:
一直在運行的啊!好好的
沒刪除啊!我用過很多辦法都不行啊
我脫離
然後再附加
曾經遇到這樣的問題!我試過把mdf拿去其他機,然後成功!我就備份bak回來原來新建
還原
都很順利!這次就是不行。回答:
是整個伺服器質疑還是只是一個資料庫?還能建庫嗎?既然禰有備份那就附加,如果附加不了估計就是伺服器問題。建議把sql重新裝下。估計就好了
有9個資料庫
,各種程序都有!同樣的程序的資料庫有三個,有兩個出問題!
之前出問題的也是同一種程序新裝sql的話,我全部停止幾個小時,肯定有損失的
而且麻煩!
我不能次次遇見這樣的問題就新裝sql吧!
我總要找個解決的辦法的啊
哪怕出現「可疑」後能夠備份bak資料庫也好!
我也經常用資料庫,也出現過質疑,基本就是我說的那兩種情況,我仔細想了下,既然是質疑,我想肯定那兩個備份文件伺服器默認找不到的緣故,只能是被移除或者更名但是禰又說備份在呢還可以附加。而且禰又有那麼多庫。不能停!禰給我截個圖吧。
Ⅱ SQL2005執行 Transact-SQL 語句或批處理時發生了異常,錯誤51,怎麼處理
是資料庫的問題許可權問題:
找到.ldf的文件右擊「屬性」,安全-〉編輯-〉添加-〉高級-〉立即查找,選擇Authenticated users,確定,在安全選項卡里選中Authenticated users編輯它的許可權,「完全控制」打勾,然後應用確定,另一個資料庫文件即.mdf的文件一樣,這樣就可以了。
P.S:這是在win8系統下的,win7的也一樣,xp我就不知道了。。
Ⅲ MySQL異常處理淺析
MySQL的異常處理分析如下:
標准格式
DECLARE
handler_type
HANDLER
FOR
condition_value[,...]
statement
handler_type:
CONTINUE
|
EXIT
|
UNDO
--這個暫時不支持
condition_value:
SQLSTATE
[VALUE]
sqlstate_value
|
condition_name
|
SQLWARNING
|
NOT
FOUND
|
SQLEXCEPTION
|
mysql_error_code
condition_value細節
1、常用MYSQL
ERROR
CODE
列表
http://dev.mysql.com/doc/refman/5.0/en/error-messages-server.html
更多錯誤列表見MySQL安裝路徑下
比如我的/usr/local/mysql/share/mysql/errmsg.txt
說明一下:SQLSTATE
[VALUE]
sqlstate_value這種格式是專門為ANSI
SQL
和
ODBC以及其他的標准.
並不是所有的MySQL
ERROR
CODE
都映射到SQLSTATE。
2、如果你不想插ERROR
CODE的話,就用速記條件來代替
SQLWARNING
代表所有以01開頭的錯誤代碼
NOT
FOUND
代表所有以02開頭的錯誤代碼,當然也可以代表一個游標到達數據集的末尾。
SQLEXCEPTION
代表除了SQLWARNING和NOT
FOUND
的所有錯誤代碼
3、我們現在就用手冊上的例子
CREATE
TABLE
t
(s1
int,primary
key
(s1));
mysql>
use
t_girl
Database
changed
mysql>
CREATE
TABLE
t
(s1
int,primary
key
(s1));
Query
OK,
0
rows
affected
(0.00
sec)
mysql>
mysql>
mysql>
DELIMITER
||
mysql>
CREATE
PROCEDURE
handlerdemo
()
->
BEGIN
->
DECLARE
EXIT
HANDLER
FOR
SQLSTATE
'23000'
BEGIN
END;
--
遇到重復鍵值就退出
->
SET
@x
=
1;
->
INSERT
INTO
t
VALUES
(1);
->
SET
@x
=
2;
->
INSERT
INTO
t
VALUES
(1);
->
SET
@x
=
3;
->
END||
Query
OK,
0
rows
affected
(0.00
sec)
mysql>
DELIMITER
;
mysql>
call
handlerdemo();
Query
OK,
0
rows
affected
(0.00
sec)
mysql>
select
@x;
+------+
|
@x
|
+------+
|
2
|
+------+
1
row
in
set
(0.00
sec)
mysql>
call
handlerdemo();
Query
OK,
0
rows
affected
(0.00
sec)
mysql>
select
@x;
+------+
|
@x
|
+------+
|
1
|
+------+
1
row
in
set
(0.00
sec)
mysql>
現在來看一下遇到錯誤繼續的情況
mysql>
truncate
table
t;
Query
OK,
0
rows
affected
(0.01
sec)
mysql>
DELIMITER
$$
mysql>
DROP
PROCEDURE
IF
EXISTS
`t_girl`.`handlerdemo`$$
Query
OK,
0
rows
affected
(0.00
sec)
mysql>
CREATE
DEFINER=`root`@`localhost`
PROCEDURE
`handlerdemo`()
->
BEGIN
->
DECLARE
CONTINUE
HANDLER
FOR
SQLSTATE
'23000'
BEGIN
END;
->
SET
@x
=
1;
->
INSERT
INTO
t
VALUES
(1);
->
SET
@x
=
2;
->
INSERT
INTO
t
VALUES
(1);
->
SET
@x
=
3;
->
END$$
Query
OK,
0
rows
affected
(0.01
sec)
mysql>
DELIMITER
;
mysql>
call
handlerdemo();
Query
OK,
0
rows
affected
(0.00
sec)
mysql>
select
@x;
+------+
|
@x
|
+------+
|
3
|
+------+
1
row
in
set
(0.00
sec)
mysql>
call
handlerdemo();
Query
OK,
0
rows
affected
(0.00
sec)
mysql>
select
@x;
+------+
|
@x
|
+------+
|
3
|
+------+
1
row
in
set
(0.00
sec)
mysql>
可以看到,始終執行到最後。
當然,上面的SQLSTATE
'23000'可以替換為1062
我們來看一下警告。
mysql>
alter
table
t
add
s2
int
not
null;
Query
OK,
0
rows
affected
(0.01
sec)
Records:
0
Duplicates:
0
Warnings:
0
此列沒有默認值,插入的時候會出現警告或者1364錯誤提示。
mysql>
DELIMITER
$$
mysql>
DROP
PROCEDURE
IF
EXISTS
`t_girl`.`handlerdemo`$$
Query
OK,
0
rows
affected,
1
warning
(0.00
sec)
mysql>
CREATE
DEFINER=`root`@`localhost`
PROCEDURE
`handlerdemo`()
->
BEGIN
->
DECLARE
CONTINUE
HANDLER
FOR
1062
BEGIN
END;
->
DECLARE
CONTINUE
HANDLER
FOR
SQLWARNING
->
BEGIN
->
update
t
set
s2
=
2;
->
END;
->
DECLARE
CONTINUE
HANDLER
FOR
1364
->
BEGIN
->
INSERT
INTO
t(s1,s2)
VALUES
(1,3);
->
END;
->
SET
@x
=
1;
->
INSERT
INTO
t(s1)
VALUES
(1);
->
SET
@x
=
2;
->
INSERT
INTO
t(s1)
VALUES
(1);
->
SET
@x
=
3;
->
END$$
Query
OK,
0
rows
affected
(0.00
sec)
mysql>
DELIMITER
;
mysql>
call
handlerdemo();
Query
OK,
0
rows
affected
(0.00
sec)
mysql>
select
*
from
t;
+----+----+
|
s1
|
s2
|
+----+----+
|
1
|
3
|
+----+----+
1
row
in
set
(0.00
sec)
遇到錯誤的時候插入的新記錄。
mysql>
select
@x;
+------+
|
@x
|
+------+
|
3
|
+------+
1
row
in
set
(0.00
sec)
Ⅳ sql函數無法向客服端返回數據
首頁 問答 PL/SQL異常處理 - 函數無返回值返回
Q
PL/SQL異常處理 - 函數無返回值返回
oracle plsql exception-handling
2016-08-20 60 views 2 likes
2
在Oracle 12.1中,我有一個相當簡單的PL/SQL常式。輸出是單個值,可以是逗號分隔的名稱列表或字元串「NO_DATA」。沒有其他輸出允許。對於輸入,有一個單一的值,一個公司名稱。如果我硬編碼公司名稱,並從SQL窗口運行SQL語句(不是函數),它運行良好,所以我知道SQL是有效的。這個問題與異常處理有關。如果我沒有任何異常處理,並傳遞一個有效的名稱給函數,它會給我一個有效的輸出。當我找不到數據時,我需要能夠處理這種情況,所以我添加了簡單的異常處理。這是我得到我的問題的地方。有了異常處理代碼,如果我傳入了一個不合適的值(又名公司名稱,未找到),我就會像'我應該'那樣得到'NO_DATA'。如果我傳遞了一個很好的值,那麼我得到一個PL/SQL錯誤ORA-06503:PL/SQL:函數返回時沒有值。這是我的代碼。PL/SQL異常處理 - 函數無返回值返回
Ⅳ 系統的一個異常SQL的處理
下面是在awr報告裡面看到的有問題的sql,是9個變數的,在應用前台屬於關聯查詢,在sqlplus裡面手工執行檢查實際執行情況如下:
下面是查詢到的綁定變數值,可以通過查看v$sql_bind_capture視圖來查看變數的實際值,如果時間比較久,可以使用如下的語句查看歷史的綁定變數信息
以下是開啟了autotrace 選項跟蹤的手工執行情況,從執行效率上看是沒有問題的。
從執行計劃和表的數據量等方面判斷如果sql的開銷有問題,應該出現在表SAMS_CHECKINOUT上面,下面檢查該表上面索引的創建語句看是否有問題
下面是在awr報告裡面看到的有問題的sql,是9個變數的,在應用前台屬於關聯查詢,在sqlplus裡面手工執行檢查實際執行情況如下:
下面是查詢到的綁定變數值,可以通過查看v$sql_bind_capture視圖來查看變數的實際值,如果時間比較久,可以使用如下的語句查看歷史的綁定變數信息
以下是開啟了autotrace 選項跟蹤的手工執行情況,從執行效率上看是沒有問題的。
從執行計劃和表的數據量等方面判斷如果sql的開銷有問題,應該出現在表SAMS_CHECKINOUT上面,下面檢查該表上面索引的創建語句看是否有問題
從上圖可以看到,實際測試出來的執行計劃跟awr報告上不同。
現在要對sql做測試
我們通過/*+ gather_plan_statistics */ 收集的相關執行計劃及其統計信息與該SQL的AWR報告中的執行計劃不同,且邏輯讀的數量與AWR報告中的數值也相差巨大。因此,為了更准確的判斷問題,按以下方法測試。
1、SQL在生產庫(SAMS庫的實例 1上,實例名為sams1 )上,在SQLPLUS中執行。
2、執行後,在同一SQLPLUS窗口中,立即執行以下命令:
結果如下:
1、在目錄下創建一個腳本文件,用來獲取更加相信的信息。
2、在SQLPLUS中,執行以下命令:@sql_rpt 3271368959 1 24114 24115 99vaabs5ptktb
4、執行完成後,在該目錄下生成一個HTML文檔,拿到更加詳細的sql統計信息附帶表的數據信息
初步分析如下:
1、該SQL執行一次的邏輯讀為11130塊次,其中第37步的邏輯讀為6127塊次,佔了一半還多。而該步的操作是根據前面的獲取到的ROWID,回表SAMS_CHECKINOUT獲取"SC".「CHECKTIME"[TIMESTAMP,11], "SC"."VERIFYCODE"[CHARACTER,4], "SC"."SN"[NVARCHAR2,40], "SC"."INSYSTIME"[TIMESTAMP,11]四列的內容。
2、第38步對SAMS_ICLOCK表的全表掃描,對整個SQL的邏輯讀也有較大貢獻。但這個不是問題的關鍵
另外索引上有兩個想法:
1、新建組合索引或改造已有索引,按如下順序構建組合索引:
(BADGENUMBER, CHECKTIME, SN, VERIFYCODE, INSYSTIME)
2、在表SAMS_ICLOCK上創建組合索引,列名及順序如下:
(SN, ALIAS)
這兩個索引先暫時不創建,先從其他方面入手
由於在測試過程中,其生成的執行計劃從未與AWR中顯示的執行計劃一致過。所以,這也許是造成不能模擬出2億個塊次邏輯讀的一個原因。因此,把有問題的SQL的執行計劃綁定到的測試SQL上。然後執行該測試SQL,並觀察和分析測試SQL的執行過程和結果來做出進一步的處理。
為完成上述想法,需要用到ORACLE的SQL PROFILE在不改變SQL文本的前提下,改變其執行計劃。操作方法如下:
1、在SQLPLUS中,生成問題SQL的創建SQL PROFILE的腳本。該腳本執行後,會要求分別輸入SQL_ID和PLAN_HASH_VALUE的值。而我們問題SQL的SQL_ID是99vaabs5ptktb,PLAN_HASH_VALUE的值是4243346097。腳本執行完成後,會在運行SQLPLUS的當前目錄中生成一個腳本文件。其名稱在執行腳本過程中的結尾有顯示。為描述方便,簡稱該生成的S腳本文件為「問題SQL腳本」。
2、再次執行該腳本,只不過這次輸入測試SQL的SQL_ID和PLAN_HASH_VALUE。其SQL_ID為3kys9xsdjrm3b,PLAN_HASH_VALUE的值為561269195。為描述方便,簡稱該生成的腳本文件為「測試SQL腳本」
3、在文本編輯工具中分別打開上述兩個腳本,將問題SQL腳本中出現在以下特徵文字之間的文字(不包含特徵文字 )復制並覆蓋掉測試SQL腳本中同樣位置的原文字:
h := SYS.SQLPROF_ATTR(
………
……….
……….
:signature := DBMS_SQLTUNE.SQLTEXT_TO_SIGNATURE(sql_txt);
4、將測試SQL腳本另存為一個文件(後綴名為.sql)
5、在SQLPLUS中執行第4步另存後的腳本。
6、在SQLPLUS中原封不動的執行原測試SQL。(註:執行前設置SQLPLUS格式,以避免格式混亂。比如 set lines 200 set pagesize 100 )
7、執行 select * from table(dbms_xplan.display_cursor('','','allstats projection last'));
如果正常生成腳本,沒有報錯信息出現在屏幕上,就是生成腳本成功。比如出現下面的提示就是正常的:
Ⅵ db2的過程中怎樣寫異常處理
創建SQL存儲過程(CREATEPROCEDURE(SQL)statement)
CREATEPROCEDUREprocere-name(IN|OUT|INOUTparameter-namedata-type,...))---存儲過程可以設定輸入參數和輸出參數
LANGUAGESQL----DB2可以用多種語言編寫存儲過程,這里用的是純SQL
BEGIN---開始
DECLAREvIDsmallint;---定義變數和Oracle一樣DECLARE變數名變數的數據類型;
FORVASSELECTBRND_CDFROMTMP_BRND_CD---for循環tmp_brnd_cd預先創建好
DO---循環體開始
SETvID=BRND_CD;---對vID賦值,db2可以用set賦值,也可以用values賦值,這里可以寫成values(BRND_CD)intovID
INSERTINTOWWM_FORINSERT_TESTVALUES(vID);---往wwm_forinsert_test插入數據
ENDFOR;-----循環體結束
END@-----存儲過程結束
參數語法說明
1、procere-name:存儲過程的名字,在同一個資料庫的同一模式下,不能存在存儲過程名相同參數數目相同的存儲過程,即使參數的類型不同也不行。
2、(IN|OUT|INOUTparameter-namedata-type,...):傳入參數IN:輸入參數OUT:輸出參數INOUT:作為輸入輸出參數parameter-name:參數名字,在此存儲過程中唯一的標識符。data-type:參數類型,可以接收SQL類型和創建的表。不支持LONGVARCHAR,LONGVARGRAPHIC,DATALINK,REFERENCE和用戶自定義類型。
3、SPECIFICspecific-name:唯一的特定名稱(別名),可以用存儲過程名代替,這個特定名稱用於dorp存儲過程,或者給存儲過程添加註視用,但不能調用存儲過程。如果不指定,則資料庫會自動生成一個yymmddhhmmsshhn時間戳的名字。推薦給出別名。
4、DYNAMICRESULTSETSinteger:指定存儲過程返回結果的最大數量。存儲過程中雖然沒有return語句,但是卻能返回結果集。
5、CONTAINSSQL,READSSQLDATA,MODIFIESSQLDATA:指定存儲過程中的SQL訪問級別CONTAINSSQL:表示存儲過程可以執行中,既不可讀取SQL數據,也不可修改SQL數據。READSSQLDATA:表示存儲過程可以執行中,可讀取SQL,但不可修改SQL數據。MODIFIESSQLDATA:表示存儲過程可以執行任何SQL語句。可以對資料庫中的數據進行增加、刪除和修改。
6、:表示存儲過程是動態或者非動態的。動態的返回的值是不確定的。非動態的存儲過程每次執行返回的值是相同的。
7、CALLEDONNULLINPUT:表示可以調用存儲過程而不管任何的輸入參數是否為NULL,並且,任何的OUT或者INOUT參數可以返回一個NULL或者非空值。檢驗參數是否為NULL是在過程中進行的。
8、INHERITSPECIALREGISTERS:表示繼承專用寄存器。
9、:建立存儲點。OLDSAVEPOINTLEVEL是默認的存儲點。
10、LANGUAGESQL:指定程序的主體用的是SQL語言。
11、:表示存儲過程是否執行一些改變理資料庫狀態的活動,而不通過資料庫管理器管。默認是EXTERNALACTION。如果指定為NOEXTERNALACTION,則資料庫會確定最最佳優化方案。
12、PARAMETERCCSID:指定所有輸出字元串數據的編碼,默認為UNICODE編碼資料庫為PARAMETERCCSIDUNICODE,其他的資料庫默認為PARAMETERCCSID3ASCII。
13、SQL-procere-body:存儲過程的主體
Ⅶ 石化通sql錯誤
網路的問題。sql錯誤多數是網路連接異常導致。
1、首先打開電腦檢查網路。
2、其次打開石化通sql進行測試網路連接是否異常。
3、最後點擊重新連接網路後重新登錄該軟體即可。
Ⅷ SQL語句執行異常
http://www.cnblogs.com/wdkshy/p/4164804.html
http://jingyan..com/article/5d6edee22daf8799eadeeca2.html
Ⅸ 執行 Transact-SQL 語句或批處理時發生了異常。 (Microsoft.SqlServer.ConnectionInfo)
估計是異常關閉了,建議恢復一下
恢復步驟:
1 停止sqlserver服務,備份msdb資料庫
2 將資料庫設置為單用戶模式
啟動sqlserver服務,將資料庫設置為單用戶模式
ALTER DATABASE ErrorDB SET SINGLE_USER
3 從其他機器拷貝msdb資料庫過來,直接替換msdb資料庫文件和日誌文件
4 對資料庫進行檢查修復
dbcc checkdb(EIMSDb,REPAIR_ALLOW_DATA_LOSS
dbcc checkdb(EIMSDb,REPAIR_REBUILD)
5 取消單用戶模式
exec sp_dboption EIMSDb, N'single', N'false'