SQL में एरर कोड सर्वर द्वारा जनरेट किया जाता है ताकि यह जानकारी दी जा सके कि क्या गलत हुआ है। आपके द्वारा उपयोग किए जा रहे SQL संस्करण के आधार पर उनके अलग-अलग अर्थ हैं, लेकिन वे आमतौर पर अनुरोधित कार्रवाई करने में असमर्थता का संकेत देते हैं।
इसका पता लगाने का सबसे आसान तरीका सबसे सरल प्रोग्रामिंग भाषा है जिसे बेसिक कहा जाता है और इसके कार्यक्रम जैसे "हैलो वर्ल्ड"। इंटरफ़ेस में निम्नलिखित टाइप करें:
PRINT "Hello, World!"
यदि आप PRINT को PRRRR के रूप में टाइप करते हैं, तो आपको एक त्रुटि संदेश प्राप्त होगा (वास्तविक जीवन में इसके बराबर कोई व्यक्ति आपको सड़क के दाईं ओर गाड़ी चलाने के लिए कहेगा, जैसे नियमों का पालन करना)।
जब सरल संचालन की बात आती है तो यह अपेक्षाकृत आसान होता है, लेकिन अधिक जटिल प्रणालियों के बारे में क्या? हम यहां SQL कोड उदाहरण भी शामिल कर रहे हैं। आनंद लें!
निम्न कोड मानक पुस्तकालय से आवश्यक कार्यों को आयात करता है, फिर एक कंसोल बनाता है, इसके मानक आउटपुट स्ट्रीम के लिए एक पॉइंटर प्राप्त करता है, और इस स्ट्रीम में संदेश को प्रिंट करता है, और उपयोग में आने वाली वस्तुओं को जारी करता है:
Option Explicit
Declare Function AllocConsole Lib "kernel32" () As Long
Declare Function FreeConsole Lib "kernel32" () As Long
Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Declare Function GetStdHandle Lib "kernel32" (ByVal nStdHandle As Long) As Long
Declare Function WriteConsole Lib "kernel32" Alias "WriteConsoleA" _
(ByVal hConsoleOutput As Long, lpBuffer As Any, ByVal _
nNumberOfCharsToWrite As Long, lpNumberOfCharsWritten As Long, _
lpReserved As Any) As Long
Declare Function Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) As Long
Private Sub Main()
'create a console instance
AllocConsole
'get handle of console output
Dim hOut As Long
hOut = GetStdHandle(-11&)
'output string to console output
Dim s As String
s = "Hello, World!" & vbCrLf
WriteConsole hOut, ByVal s, Len(s), vbNull, vbNull
'make a pause to look at the output
Sleep 2000
'close the handle and destroy the console
CloseHandle hOut
FreeConsole
End Sub
यदि आप इस कोड में कोई त्रुटि करते हैं, तो इसे खोजने में कुछ समय लगता है, खासकर यदि आपके पास इस तरह के कोड के 500 पृष्ठ हैं। इसलिए, कंप्यूटर त्रुटियों का पता लगाएगा और आपको बताएगा कि वे कहां हैं।
SQL त्रुटि कोड क्या हैं और वे कैसे काम करते हैं?
SQL त्रुटि कोड की उपयोगिता यह है कि सॉफ़्टवेयर आपका कोड ढूंढता है और उसे इंगित करता है (उदाहरण)। आपको हजारों कोड लाइनों को मैन्युअल रूप से जांचने की ज़रूरत नहीं है। कभी भी केवल एक त्रुटि कोड प्राप्त करने की कल्पना करें ("अगली बार बेहतर भाग्य, हारे हुए!" या "किसने आपको कोड करना सिखाया, एक घोड़ा?") और फिर से पूरी परियोजना पर जाना है!
एक मायने में, त्रुटि कोड उत्कृष्ट सांता के छोटे सहायक हैं:स्पष्ट, उपयोगी, और बहुत समय बचाते हैं। आपको बस उन्हें जानना है।
बुनियादी स्तर से शुरू होकर, डेटाबेस सूचनाओं का संग्रह होता है जिसे एक साथ रखा जाता है और वर्गीकृत किया जाता है। जिस प्रकार में हम रुचि रखते हैं वह संबंधपरक डेटाबेस है, जिसका अर्थ है कि डेटा को संग्रहीत करने वाले कक्षों के बीच संबंध हैं।
उदाहरण के लिए, आपके पास एक विश्वविद्यालय में छात्रों का एक पूरा समूह हो सकता है और उन सभी को पुरस्कार देना चाहते हैं, जिन्होंने अपनी परीक्षा में 90% से अधिक अंक प्राप्त किए हैं। आप मैन्युअल रूप से उनके नाम, लिंग, पते, बैंक खाता संख्या (ये सभी संबंधित हैं, इसलिए रिलेशनल डेटाबेस), ग्रेड लिख सकते हैं, और फिर मैन्युअल रूप से उच्च स्कोर वाले लोगों को चुन सकते हैं।
पुरातन? हां, लेकिन आपको यह जानकर हैरानी होगी कि 21वीं सदी में कितनी कंपनियां अभी भी इस तरह से कारोबार करती हैं। उन कार्यों को पूरा करने में महीनों लग सकते हैं जिन्हें करने में एक कंप्यूटर सेकंड का समय लगता है। खासकर अगर हम सैकड़ों या हजारों छात्रों के बारे में बात कर रहे हैं।
अब, इन सभी छात्रों को एक डेटाबेस में डालकर आप SQL जैसी भाषा का उपयोग कर सकते हैं:
SELECT * FROM Student WHERE Percentage>=90;
पूर्ण! हालाँकि, समस्याएँ तब शुरू होती हैं जब आप अपना कोड लिखते हैं।
निश्चित रूप से यह बहुत जटिल हो जाता है, इसलिए जितना अधिक आप लिखते हैं, आपके कोड में त्रुटियां होने की संभावना उतनी ही अधिक होती है। यहां, त्रुटि कोड सबसे उपयोगी होंगे। जब हम त्रुटि कोड देखते हैं, तो हमें आभारी होना चाहिए (जो हमें हर बार उन्हें गाली देने से नहीं रोकता है)। वे आपके लिए सारा काम करते हैं, और आपको बस स्रोत पर जाकर समस्या को ठीक करना है।
मुझे कुछ खास जानकारी दें!
जब कोई डेटाबेस वांछित परिणाम उत्पन्न करने में विफल रहता है, तो एक त्रुटि कोड फेंका जाता है। यह समस्या की पहचान करने और इसे ठीक करने में मदद करता है। SQL त्रुटि कोड, जैसे नीचे दिए गए हैं, आपके डेटाबेस के साथ किसी भी समस्या का निवारण करते समय उपयोगी होंगे:
Oracle9i डेटाबेस त्रुटि संदेश
रिलीज़ 2 (9.2)
ORA-00904:"पंक्तियों की निर्दिष्ट संख्या अधिकतम से अधिक है"।
ORA-00900:"वस्तु पर अपर्याप्त विशेषाधिकार"।
ORA-00900:"अमान्य SQL कथन"।
ORA-00902:"अमान्य डेटाटाइप"।
SQL में हमारे पास कई अलग-अलग प्रकार की त्रुटियां हैं। लेकिन अगर आप उन्हें फ्रेम करके अपनी दीवार पर नहीं लगाने जा रहे हैं, तो आपको यह जानना होगा कि उनसे कैसे निपटना है। अच्छी बात यह है कि SQL त्रुटियाँ एक कोड में त्रुटि के सटीक स्थान के लिंक के साथ आती हैं, और यह भी जानकारी प्रदान करती हैं कि क्या गलत है।
आइए सबसे सरल त्रुटि उदाहरण से शुरू करें:
ORA-00900:"अमान्य SQL कथन"।
जैसा कि आपने शायद अनुमान लगाया है, आपको कमांड को ठीक से लिखना होगा। कहीं न कहीं यह टाइपो या अल्पविराम हो सकता है। या, जैसा भी मामला हो, आपको अतिरिक्त सॉफ़्टवेयर स्थापित करने की आवश्यकता हो सकती है:
“कथन को मान्य SQL कथन के रूप में पहचाना नहीं गया है।
यह त्रुटि हो सकती है यदि प्रक्रियात्मक विकल्प स्थापित नहीं है और एक SQL कथन जारी किया जाता है जिसके लिए इस विकल्प की आवश्यकता होती है (उदाहरण के लिए, एक प्रक्रिया बनाएं कथन)। आप यह निर्धारित कर सकते हैं कि SQL*Plus प्रारंभ करके प्रक्रियात्मक विकल्प स्थापित है या नहीं। यदि PL/SQL बैनर प्रदर्शित नहीं होता है, तो विकल्प स्थापित नहीं है।
कार्रवाई:वाक्य रचना को ठीक करें या प्रक्रियात्मक विकल्प स्थापित करें"।
वही स्वरूपण के प्रकार या गलत डेटा प्रकार डालने के लिए जाता है जहां वे संबंधित नहीं हैं:
ORA-00902 अमान्य डेटा प्रकार
“कारण:CREATE या ALTER TABLE स्टेटमेंट में दर्ज किया गया डेटाटाइप मान्य नहीं है।
कार्रवाई:वाक्य-विन्यास ठीक करें”।
आप Oracle दस्तावेज़ीकरण में अधिक जानकारी प्राप्त कर सकते हैं।
SQL त्रुटि कोड SQL क्वेरी को डीबग करने का सबसे सामान्य तरीका है। जब भी आप डेटाबेस को क्वेरी करते हैं, और समस्या होती है, तो डेटाबेस इंजन SQL त्रुटि कोड उत्पन्न करता है। ये कोड क्वेरी में समस्या के स्थान का प्रतिनिधित्व करते हैं और प्रोग्रामर को यह जानकारी देते हैं कि इसे कैसे ठीक किया जाए या इसके कारण की व्याख्या कैसे की जाए।
त्रुटियों के मुख्य प्रकार
प्रारूप त्रुटियां
उदाहरण के लिए, जब आप SELECT का उपयोग कर रहे हों, तो आपको एक निश्चित क्रम के साथ इसका पालन करना होगा (तालिका में कॉलम सूचीबद्ध करें, जिसमें हमारे छात्र और उनके ग्रेड शामिल हैं), फिर एक स्टार। यदि आप प्रारूप का पालन नहीं करते हैं, तो एक तारे और अल्पविराम की अदला-बदली करें, आपको एक त्रुटि संदेश मिलेगा।
“अगर कोई लेन-देन शुरू होता है, तो उसे हमेशा COMMIT या रोलबैक लेन-देन के साथ खत्म होना चाहिए।”
एक अन्य उदाहरण:FROM के बाद आप WHERE जैसे ऑपरेटरों का उपयोग करते हैं जिसके लिए एक शर्त की आवश्यकता होती है। यह कोई भी स्थिति हो सकती है, जिसमें डेटा निकालने वाली स्थितियां भी शामिल हैं, उदाहरण के लिए, 30 से कम ग्रेड वाले सभी छात्र। यदि आप इस फ़ील्ड को खाली छोड़ देते हैं, तो आपको एक प्रारूप त्रुटि मिलेगी।
ऑपरेटर त्रुटि
कमांड को SQL के साथ संगत होना चाहिए। आप WHERE के साथ SUM और COUNT शामिल कर सकते हैं। अन्यथा, आपको एक त्रुटि मिलती है।
प्रक्रियात्मक त्रुटियां
प्रक्रियात्मक कोड सर्वर पर संग्रहीत कोड है जिसे आप अपने उद्देश्यों के लिए मामूली परिवर्तनों के साथ उपयोग कर सकते हैं।
“संग्रहीत कार्यविधि एक तैयार SQL कोड है जिसे आप सहेज सकते हैं, इसलिए कोड को बार-बार पुन:उपयोग किया जा सकता है… इसलिए यदि आपके पास एक SQL क्वेरी है जिसे आप बार-बार लिखते हैं, तो इसे संग्रहीत कार्यविधि के रूप में सहेजें, और फिर इसे निष्पादित करने के लिए बस इसे कॉल करें।" ( W3 स्कूल )
ग्राहक . नामक तालिका से संग्रहीत कार्यविधि बनाने के लिए इसके सभी रिकॉर्ड के साथ और इसे निष्पादित करने के लिए, हमारे पास निम्न कोड है:
CREATE PROCEDURE SelectAllCustomers
AS
SELECT * FROM Customers
GO;
EXEC SelectAllCustomers;
दूसरे शब्दों में, प्रक्रियाएं सर्वर पर संग्रहीत टेम्प्लेट की तरह होती हैं जिन्हें आप आवश्यकतानुसार ले सकते हैं, संशोधित कर सकते हैं और उपयोग कर सकते हैं।
प्रक्रियात्मक त्रुटियां कमोबेश सामान्य प्रकार की त्रुटियां हैं। अंतर यह है कि, वे कोड की एक पंक्ति नहीं बल्कि पूरी प्रक्रिया (टेम्पलेट) को संदर्भित करते हैं जिसे आपने लिया और थोड़ा बदलने की कोशिश की।
कल्पना कीजिए कि आपके पास दो टेबल हैं, एक खाली और एक भरी हुई। आप नीचे दिए गए कोड को खाली टेबल पर लागू करें:
INSERT to transfer data
SELECT and WHERE to choose data
एक रणनीतिक त्रुटि का एक उदाहरण IN और NOT IN ऑपरेटरों जैसे ऑपरेटरों का उपयोग करना होगा। यह आकर्षक है फिर भी बहुत अच्छी तरह से अनुकूलित नहीं है (जॉइन का उपयोग करना एक बेहतर रणनीतिक विकल्प है)।
घातक और गैर-घातक त्रुटियां
MySQL या PostgreSQL जैसा डेटाबेस डेटा को टेबल में स्टोर करता है, जो पंक्तियों और स्तंभों से बना होता है। डेटाबेस क्वेरीज़ SQL कमांड हैं जो डेटाबेस को बताती हैं कि उसके डेटा के साथ क्या करना है। वे किसी तालिका से सभी रिकॉर्ड चुनने जितना आसान हो सकता है, या एक पूरी तरह से नई तालिका बनाने के लिए पर्याप्त जटिल हो सकता है।
इन आदेशों का उपयोग करते समय दो प्रकार की त्रुटियां हो सकती हैं:घातक और गैर-घातक।
एक घातक त्रुटि एक बयान के निष्पादन को रोकती है, जबकि एक गैर-घातक त्रुटि नहीं होती है।
एक घातक त्रुटि एक डेटाबेस त्रुटि है जिसे ठीक नहीं किया जा सकता है। एक गैर-घातक त्रुटि एक ऐसी समस्या है जिसे किसी तरह हल किया जा सकता है, उदाहरण के लिए SQL सर्वर सेवा या SQL सर्वर की आवृत्ति को पुनरारंभ करके।
एक डेटाबेस में कई कारणों से किसी भी समय घातक और गैर-घातक दोनों त्रुटियां हो सकती हैं। कभी-कभी, यदि आप इस मुद्दे से अवगत हैं, तो इसे बिना किसी कठिनाई के हल करना संभव है। दूसरी बार, इतना नहीं।
सबसे आम प्रकार की त्रुटि डेटाबेस सिस्टम के साथ सिंटैक्स या अन्य रनटाइम समस्या है जो SQL तालिका से डेटा तक पहुँचती है। इन त्रुटियों को कोड चलाने से पहले परीक्षण में पकड़ा जा सकता है। आप यह सुनिश्चित कर सकते हैं कि डेटाबेस सिस्टम के विरुद्ध निष्पादित होने पर सब कुछ ठीक से काम करता है।
RAISERROR के साथ अपने त्रुटि कोड बनाना
“एक RAISERROR फ़ंक्शन है जिसका उपयोग हमारे कस्टम त्रुटि संदेशों को उत्पन्न करने के लिए किया जा सकता है जो भ्रमित करने वाले त्रुटि संदेशों को कुछ अधिक अर्थपूर्ण चीज़ों में अनुवाद करने का एक शानदार तरीका है जिसे लोग समझेंगे।”
RAISERROR फ़ंक्शन एक SQL सर्वर सिस्टम कमांड है जो एक त्रुटि संदेश उठा सकता है। आप इसका उपयोग त्रुटियों, चेतावनियों या सूचनात्मक संदेशों को इंगित करने के लिए कर सकते हैं।
त्रुटियां प्रोग्रामर या SQL सर्वर द्वारा ही हो सकती हैं। यह कुछ गलत होने पर प्रतिक्रिया देने के लिए उपयोगी है, लेकिन तब भी जब बैच में अन्य कथनों के निष्पादन को बाधित किए बिना कुछ होने की आवश्यकता होती है।
निम्नलिखित सिंटैक्स का प्रयोग करें:
RAISERROR ( [ error_number ] , [ message ], [ state ])
आप किसी कथन के निष्पादन को समाप्त करने के लिए या किसी अन्य अनुप्रयोग के लिए SQL कथनों द्वारा उत्पन्न त्रुटियों को पारित करने के लिए RAISERROR भी लागू कर सकते हैं। उदाहरण के लिए, आप एक त्रुटि संदेश उठा सकते हैं जो वर्तमान बैच या कथन के निष्पादन को रोक देगा, साथ ही निर्दिष्ट संदेश प्रदर्शित करेगा।
RAISERROR के लिए सबसे आम उपयोग एक त्रुटि संदेश उत्पन्न करना है जब डेटा कुछ मानदंडों को पूरा नहीं करता है, जैसे किसी फ़ील्ड में बहुत अधिक वर्ण दर्ज करना जो केवल 50 वर्णों की अनुमति देता है।
प्रसंस्करण के दौरान होने वाली त्रुटियों से निपटने के लिए रायसर (msg) उपयोगी है, और इसके लिए एक व्यक्तिगत त्रुटि के कारण पूरे लेनदेन को विफल होने की आवश्यकता नहीं है।
अब आप अपनी खुद की जितनी चाहें उतनी त्रुटियां बना सकते हैं। आनन्दित!
त्रुटियों से निपटना
त्रुटियों से निपटने के लिए, हमें उन्हें नियंत्रित करने और सभी संबंधित जानकारी का पता लगाने में सक्षम होना चाहिए। यह किसी भी मामले के लिए आवश्यक है जो "हैलो वर्ल्ड" में PRINT को गलत टाइप करने से अधिक जटिल है।
त्रुटियों को पकड़ने का एक उपयोगी तरीका TRY…CATCH का उपयोग करना है। यह उपकरण आपको अपना कोड लेने और इसे ऐसे वातावरण में रखने की अनुमति देता है जहां इसकी जांच की जा सके और सुरक्षित रूप से संभाला जा सके। वहां, आप इससे डेटा निकाल सकते हैं। तय करें कि क्या आप त्रुटि की रिपोर्ट करना चाहते हैं, इसके बारे में अधिक जानकारी प्राप्त करना चाहते हैं या इसे ठीक करना चाहते हैं।
यह SQL सर्वर सैंडबॉक्स इस प्रकार है:
BEGIN TRY
--code to try
END TRY
BEGIN CATCH
--code to run if an error occurs
--is generated in try
END CATCH
आप जो कोड देखना चाहते हैं, वह BEGIN TRY और END TRY के बीच में रखा गया है। यदि गलतियाँ होती हैं, तो इसे CATCH स्टेटमेंट में भेज दिया जाता है। यह हमें बहुत उपयोगी कार्यक्षमता प्रदान करता है:
- ERROR_NUMBER त्रुटि की आंतरिक संख्या लौटाता है
- ERROR_STATE स्रोत के बारे में जानकारी देता है
- ERROR_SEVERITY सूचना संबंधी त्रुटियों से लेकर DBA के उपयोगकर्ताओं द्वारा ठीक की जा सकने वाली त्रुटियों आदि तक किसी भी चीज़ के बारे में जानकारी लौटाता है।
- ERROR_LINE वह पंक्ति संख्या लौटाता है जिस पर त्रुटि हुई
- ERROR_PROCEDURE संग्रहीत कार्यविधि या फ़ंक्शन का नाम देता है
- ERROR_MESSAGE सबसे आवश्यक जानकारी देता है और वह त्रुटि का संदेश टेक्स्ट है।
जब हम 1 को 0 से विभाजित करने का प्रयास करते हैं तो हमें यही मिलता है:
USE AdventureWorks2014
GO
-- Basic example of TRY...CATCH
BEGIN TRY
-- Generate a divide-by-zero error
SELECT
1 / 0 AS Error;
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber,
ERROR_STATE() AS ErrorState,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_PROCEDURE() AS ErrorProcedure,
ERROR_LINE() AS ErrorLine,
ERROR_MESSAGE() AS ErrorMessage;
END CATCH;
GO
जैसा कि आप देख सकते हैं, TRY…CATCH फ़ंक्शन बहुत उपयोगी है।
सारांश
अब आप ठीक से जानते हैं कि SQL त्रुटि कोड क्या है, किस प्रकार की त्रुटियां हैं, वे क्यों होती हैं, उन्हें कैसे सैंडबॉक्स किया जाता है और उनका अध्ययन किया जाता है, अपने त्रुटि संकेतों को कैसे बनाया जाए, आदि। आप त्रुटियों से निपटने के लिए तैयार होने से कहीं अधिक हैं! यदि नहीं, तो हमें बताएं, और हम भविष्य में और मार्गदर्शिकाएँ जारी करेंगे। शुभकामनाएँ!