SQLステートメントのコンパイル

2011. 02. 18
int sqlite3_prepare(
    sqlite3 *db,
    const char *zSql,
    int nByte,
    sqlite3_stmt **ppStmt,
    const char **pzTail
);
int sqlite3_prepare_v2(
    sqlite3 *db,
    const char *zSql,
    int nByte,
    sqlite3_stmt **ppStmt,
    const char **pzTail
);
int sqlite3_prepare16(
    sqlite3 *db,
    const void *zSql,
    int nByte,
    sqlite3_stmt **ppStmt,
    const void **pzTail
);
int sqlite3_prepare16_v2(
    sqlite3 *db,
    const void *zSql,
    int nByte,
    sqlite3_stmt **ppStmt,
    const void **pzTail
);
    
/* データベース名 */
/* UTF-8エンコードのSQLステートメント */
/* zSqlのバイト単位の最大長 */
/* 出力:ステートメント名 */
/* 出力:zSqlの未使用部分へのポインタ */


/* データベース名 */
/* UTF-8エンコードのSQLステートメント */
/* zSqlのバイト単位の最大長 */
/* 出力:ステートメント名 */
/* 出力:zSqlの未使用部分へのポインタ */


/* データベース名 */
/* UTF-16エンコードのSQLステートメント */
/* zSqlのバイト単位の最大長 */
/* 出力:ステートメント名 */
/* 出力:zSqlの未使用部分へのポインタ */


/* データベース名 */
/* UTF-16エンコードのSQLステートメント */
/* zSqlのバイト単位の最大長 */
/* 出力:ステートメント名 */
/* 出力:zSqlの未使用部分へのポインタ */

SQLクエリを実行するには、最初にこれらルーチンの一つを使用してバイトコードにプログラムをコンパイルする必要があります。

第1引数の『db』は、事前にsqlite3_open()sqlite3_open_v2()、またはsqlite3_open16()の呼び出しが成功したことによって取得されたdatabase connectionです。

データベース接続は閉じてはいけません。

第2引数の『zSql』はコンパイルするステートメントで、UTF-8またはUTF-16でエンコードされます。

sqlite3_prepare()とsqlite3_prepare_v2()インターフェイスはUTF-8を、sqlite3_prepare16()とsqlite3_prepare16_v2()はUTF-16を使用しています。

引数nByteがゼロより小さい場合、zSqlは最初のゼロ終端まで読み込まれます。

nByteが負でない場合、zSqlからバイトの最大値まで読み込まれます。

nByteが負でない場合、zSql文字列は『\000』または『\u0000』文字、あるいはnByte番目のバイトの、いずれか最初に来る位置で終了します。

指定した文字列がヌル終端であることを呼び出し側が知っている場合、ヌル終端のバイト列を含む入力文字列内のバイト数に等しいため、nByteパラメータを渡すことによって僅かな性能の利益が得られます。

pzTailがNULLでない場合、*pzTailはzSql内にある最初のSQLステートメントの末尾を超えた最初のバイトを指します。

これらのルーチンはzSql内の最初のステートメントをコンパイルする場合のみで、*pzTailはコンパイルされずに残っている点を指します。

*ppStmtは、sqlite3_step()を使用して実行することができる、コンパイル済みのprepared statementを指します。

エラーがある場合、*ppStmtはNULLに設定されます。

入力テキストが(空の文字列またはコメントで)SQLを含まない場合、*ppStmtはNULLを指します。

呼び出し元のプロシージャは、sqlite3_finalize()を使用した処理が完了した後で、コンパイル済みのSQLステートメントを削除する責任があります。

ppStmtはNULLではない可能性があります。

成功した場合、ルーチンのsqlite3_prepare()ファミリはSQLITE_OKを返し、それ以外の場合ははerror codeを返します。

sqlite3_prepare_v2()とsqlite3_prepare16_v2()インターフェイスは、全ての新しいプログラムで推奨されます。

2つの古いインターフェイスは下位互換のために保持し、使用は推奨されません。

『v2』インターフェイスではprepared statement、即ちオリジナルのSQLテキストのコピーを含む(sqlite3_stmtオブジェクト)を返します。

sqlite3_step()インターフェイスは、以下の3つの方法で異なる振る舞いをします。

  1. データベースのスキーマが変更された場合、常に使用されるものとしてSQLITE_SCHEMAが代わりに返され、sqlite3_step()が自動的にSQLステートメントを再コンパイルし、再度実行を試みます。

  2. エラーが発生した場合、sqlite3_step()は詳細なerror codesまたはextended error codesの一つを返します。
  3. 従来の動作ではsqlite3_step()のみが一般的なSQLITE_ERROR結果コードを返し、アプリケーションは問題の根本的な原因を見つけるために、2回目のsqlite3_reset()の呼び出しを作成していました。
    『v2』の付いた準備インターフェイスは、エラーの根本的な原因はすぐに返されます。

  4. 指定した値がWHERE節内のhost parameterにバインドされている場合、ステートメントのクエリ手順の選択に影響を及ぼす可能性があるため、ステートメントは自動的に再コンパイルし、同様にスキーマの変更があった場合は、最初のsqlite3_step()で以下のparameterbindingsへの変更を呼び出します。
  5. パラメータがLIKEまたはGLOB演算子の左側の場合、またはパラメータがインデックス列と比較されている場合で、コンパイル時のオプションSQLITE_ENABLE_STAT2が有効な場合、WHEREのparameterの指定した値はクエリ手順の選択に影響を及ぼす可能性があります。

ObjectsConstantsFunctionsの一覧を参照してください。



参考文献

Compiling An SQL Statement

Wikipedia/プロシージャ

Wikipedia/スキーマ(データベース)

0 CommentsPosted in SQLite





bose_soundlink_revolve
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
03 | 2017/04 | 05
Sun Mon Tue Wed Thu Fri Sat
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 - - - - - -
Recent Articles
iTunes


Swift
Categories
Tips
Profile

水月杏香

Author:水月杏香
永遠の初心者プログラマ。

Wish List
WACOM


ARC
Technical Q&A
情報プロパティリストキー
Start Developing iOS Apps Today
BOSE

bose_soundlink_revolve
Reference
NSApplicationDelegateプロトコル
NSArrayクラス
NSAutoreleasePoolクラス
NSBundleクラス
NSBundle UIKit追加分
NSCalendarクラス
NSCoderクラス
NSCodingプロトコル
NSCopyingプロトコル
NSDataクラス
NSDateクラス
NSDateFormatterクラス
NSDictionaryクラス
NSEntityDescriptionクラス
NSEnumeratorクラス
NSErrorクラス
NSExceptionクラス
NSFetchRequestクラス
NSFileHandleクラス
NSFileManagerクラス
NSIndexPathクラス
NSIndexPath UIKit追加分
NSKeyedArchiverクラス
NSKeyedUnarchiverクラス
NSKeyValueCodingプロトコル
NSLocaleクラス
NSManagedObjectクラス
NSManagedObjectContextクラス
NSManagedObjectModelクラス
NSMutableArrayクラス
NSMutableCopyingプロトコル
NSMutableDictionaryクラス
NSMutableSetクラス
NSNotificationクラス
NSNotificationCenterクラス
NSNullクラス
NSNumberクラス
NSObjectクラス
NSObject UIKit追加分
NSObjectプロトコル
NSPersistentStoreクラス
NSPersistentStoreCoordinatorクラス
NSPredicateクラス
NSPropertyListSerializationクラス
NSRunLoopクラス
NSSetクラス
NSStringクラス
NSString UIKit追加分
NSTimerクラス
NSTimeZoneクラス
NSURLクラス
NSURLProtectionSpaceクラス
NSURLRequestクラス
NSUserDefaultsクラス
NSValueクラス

UIActionSheetクラス
UIActionSheetDelegateプロトコル
UIActivityIndicatorViewクラス
UIAlertViewクラス
UIAlertViewDelegateプロトコル
UIApplicationクラス
UIApplicationDelegateプロトコル
UIBarButtonItemクラス
UIBarItemクラス
UIButtonクラス
UIColorクラス
UIControlクラス
UIDatePickerクラス
UIDeviceクラス
UIEventクラス
UIFontクラス
UIGestureRecognizerクラス
UIImageクラス
UIImageViewクラス
UIKit Function
UILabelクラス
UINavigationControllerクラス
UINavigationItemクラス
UIPickerViewクラス
UIPickerViewDataSourceプロトコル
UIPickerViewDelegateプロトコル
UIPinchGestureRecognizerクラス
UIResponderクラス
UIScreenクラス
UIScrollViewクラス
UISearchBarクラス
UISearchBarDelegateプロトコル
UISegmentedControlクラス
UISliderクラス
UISwipeGestureRecognizerクラス
UISwitchクラス
UITableViewクラス
UITableViewCellクラス
UITableViewControllerクラス
UITableViewDataSourceプロトコル
UITableViewDelegateプロトコル
UITapGestureRecognizerクラス
UITextFieldクラス
UITextFieldDelegateプロトコル
UITextInputTraitsプロトコル
UITextViewクラス
UITextViewDelegateプロトコル
UIToolbarクラス
UITouchクラス
UIViewクラス
UIViewControllerクラス
UIWebViewクラス
UIWebViewDelegateプロトコル
UIWindowクラス

AVAudioPlayerクラス
AVAudioPlayerDelegateプロトコル

CADisplayLinkクラス
CAEAGLLayerクラス
CALayerクラス

CGAffineTransform
CGBitmapContext
CGColor
CGColorSpace
CGContext
CGGeometry
CGImage
CGPath

EAGLContextクラス
EAGLDrawableプロトコル

Foundation Constants
Foundation Data Types
Foundation Functions

MPMediaItemクラス
MPMediaItemArtworkクラス
MPMediaPlaylistクラス
MPMediaPropertyPredicateクラス
MPMediaQueryクラス
MPMusicPlayerControllerクラス

Randomization Services

System Sound Services
Amazon


OpenGL ES
SQLite
Monthly Archives
Recent Comments
Recent TrackBacks
RSS Link
Visitors
QR Code
QR