sql >> データベース >  >> RDS >> Database

SQLエラーの読み取りと解釈の方法

    SQLのエラーコードはサーバーによって生成され、何が問題になったかに関する情報を提供します。使用しているSQLのバージョンによって意味は異なりますが、通常、要求された操作を実行できないことを示しています。

    それを探索する最も簡単な方法は、BASICと呼ばれる最も単純なプログラミング言語と「Helloworld」のようなそのプログラムです。インターフェイスに次のように入力します:

    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エラーコードの有用性は、ソフトウェアがコードを見つけてそれを指すことです(例)。何千ものコード行を自分で手動でチェックする必要はありません。エラーコードを1つだけ取得し(「次回は幸運を祈ります、敗者!」または「誰がコーディング方法を教えてくれましたか?」)、プロジェクト全体をもう一度やり直す必要があると想像してみてください。

    ある意味で、エラーコードは、サンタさんの小さな助っ人として優れています。明確で、便利で、時間を大幅に節約できます。あなたはそれらを知る必要があります。

    基本レベルから始めて、データベースは、まとめられて分類された情報のコレクションです。関心のあるタイプはリレーショナルデータベースです。つまり、データが保存されているセル間には関係があります。

    たとえば、大学に学生のグループ全体がいて、試験で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ステートメントとして認識されません。

    このエラーは、Procedural Optionがインストールされておらず、このオプションを必要とするSQLステートメント(CREATE PROCEDUREステートメントなど)が発行された場合に発生する可能性があります。 SQL * Plusを起動すると、ProceduralOptionがインストールされているかどうかを確認できます。 PL / SQLバナーが表示されない場合、オプションはインストールされていません。

    アクション:構文を修正するか、ProceduralOptionをインストールしてください。

    同じことが、フォーマットのタイプや、それらが属していない間違ったデータタイプの配置にも当てはまります。

    ORA-00902無効なデータ型

    「原因:CREATEまたはALTERTABLEステートメントに入力されたデータ型が無効です。

    アクション:構文を修正してください」。

    詳細については、Oracleのドキュメントを参照してください。

    SQLエラーコードは、SQLクエリをデバッグするための最も一般的な方法です。データベースにクエリを実行し、問題が発生するたびに、データベースエンジンはSQLエラーコードを生成します。これらのコードは、クエリ内の問題の場所を表し、問題を修正する方法または問題の原因を解釈する方法に関する情報をプログラマーに提供します。

    主な種類のエラー

    フォーマットエラー

    たとえば、SELECTを使用している場合は、特定の順序(生徒とその成績を含む表の列を一覧表示)、次に星を付ける必要があります。形式に従わず、星とカンマを入れ替えると、エラーメッセージが表示されます。

    「BEGINTRANSACTIONがある場合は、常にCOMMITまたはROLLBACKトランザクションで終了する必要があります。」

    別の例:FROMの後で、条件を必要とするWHEREのような演算子を使用します。データを抽出する条件を含む、任意の条件にすることができます。たとえば、成績が30未満のすべての生徒です。このフィールドを空白のままにすると、形式エラーが発生します。

    オペレーターエラー

    コマンドはSQLと互換性がある必要があります。 WHEREにSUMとCOUNTを含めることができます。そうしないと、エラーが発生します。

    手続き上のエラー

    手続き型コードは、サーバーに保存されているコードであり、小さな変更を加えるだけで目的に使用できます。

    「ストアドプロシージャは、保存できる準備済みのSQLコードであるため、コードを何度も再利用できます。したがって、SQLクエリを何度も作成する場合は、ストアドプロシージャとして保存します。それを呼び出して実行します。」 ( W3スクール

    Customersというテーブルからストアドプロシージャを作成するには すべてのレコードを使用して実行すると、次のコードが得られます。

    CREATE PROCEDURE SelectAllCustomers
    AS
    SELECT * FROM Customers
    GO;
    
    EXEC SelectAllCustomers;
    

    つまり、プロシージャはサーバーに保存されているテンプレートのようなものであり、必要に応じて取得、修正、および使用できます。

    手続き型エラーは、多かれ少なかれ通常の種類のエラーです。違いは、1行のコードではなく、少し変更しようとした手順全体(テンプレート)を参照していることです。

    空のテーブルと満杯のテーブルの2つのテーブルがあるとします。空のテーブルに次のコードを適用します:

    INSERT to transfer data
    SELECT and WHERE to choose data
    

    戦略的エラーの例は、IN演算子やNOTIN演算子などの演算子を使用することです。魅力的ですが、あまり最適化されていません(JOINを使用する方がはるかに優れた戦略的選択です)。

    致命的および非致命的エラー

    MySQLやPostgreSQLのようなデータベースは、行と列で構成されるテーブルにデータを格納します。データベースクエリは、データベースにデータの処理方法を指示するSQLコマンドです。テーブルからすべてのレコードを選択するのと同じくらい単純な場合もあれば、まったく新しいテーブルを作成するのに十分なほど複雑な場合もあります。

    これらのコマンドを使用するときに発生する可能性のあるエラーには、致命的および非致命的の2種類があります。

    致命的なエラーはステートメントの実行を停止しますが、致命的でないエラーは停止しません。

    致命的なエラーは、修正できないデータベースエラーです。致命的でないエラーとは、SQLServerサービスまたはSQLServerのインスタンスを再起動するなどの方法で解決できる問題です。

    データベースには、さまざまな理由で、いつでも致命的なエラーと致命的でないエラーの両方が発生する可能性があります。問題を認識している場合は、それほど問題なく解決できる場合があります。それ以外の場合は、それほど多くはありません。

    最も一般的なタイプのエラーは、SQLテーブルのデータにアクセスするデータベースシステムの構文またはその他のランタイムの問題です。これらのエラーは、コードを実行する前のテストで検出できます。データベースシステムに対して実行すると、すべてが正しく機能することを確認できます。

    RAISERRORを使用したエラーコードの作成

    「カスタムエラーメッセージを生成するために使用できるRAISERROR関数があります。これは、紛らわしいエラーメッセージを、人々が理解できるもう少し意味のあるものに変換するための優れた方法です。」

    RAISERROR関数は、エラーメッセージを表示する可能性のあるSQLサーバーシステムコマンドです。これを使用して、エラー、警告、または情報メッセージを示すことができます。

    エラーは、プログラマーまたはSQLServer自体が原因で発生する可能性があります。これは、問題が発生した場合だけでなく、バ​​ッチ内の他のステートメントの実行を中断せずに何かが発生する必要がある場合にもフィードバックを提供するのに役立ちます。

    次の構文を使用します:

    RAISERROR ( [ error_number ] , [ message ], [ state ])

    RAISERRORを適用して、ステートメントの実行を終了するか、SQLステートメントによって生成されたエラーを別のアプリケーションに渡すこともできます。たとえば、現在のバッチまたはステートメントの実行を停止させるエラーメッセージを表示したり、指定したメッセージを表示したりできます。

    RAISERRORの最も一般的な使用法は、50文字しか許可されていないフィールドに入力する文字が多すぎるなど、データがいくつかの基準を満たさない場合にエラーメッセージを生成することです。

    Raiserror(msg)は、処理中に発生するエラーを処理するのに役立ち、1つの個別のエラーのためにトランザクション全体が失敗する必要はありません。

    これで、必要な数の独自のエラーを作成できます。喜ぶ!

    エラーへの対処

    エラーに対処するには、エラーを制御し、すべての関連情報を見つけることができなければなりません。 「HelloWorld」でPRINTの入力ミスよりも複雑な場合に必要です。

    エラーをキャッチする便利な方法の1つは、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
    

    監視するコードは、BEGINTRYとENDTRYの間に配置されます。間違いが発生した場合は、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エラーコードとは何か、エラーの種類、エラーが発生する理由、サンドボックス化と調査の方法、エラーシグナルの作成方法などが正確にわかりました。エラーに対処する準備ができているだけではありません。そうでない場合は、お知らせください。今後、さらに多くのガイドをリリースする予定です。頑張ってください!


    1. Oracleで2列のデータをA、B形式で取得する方法

    2. SQLiteのCount()結果から重複を削除

    3. PL/SQLを使用してOracle11gのJSONファイルにデータをエクスポートする

    4. DockerへのPostgreSQLのインストール