亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目錄 搜索
前言 何為PostgreSQL? PostgreSQL簡史 格式約定 更多信息 臭蟲匯報指導(dǎo) I. 教程 章1. 從頭開始 1.1. 安裝 1.2. 體系基本概念 1.3. 創(chuàng)建一個數(shù)據(jù)庫 1.4. 訪問數(shù)據(jù)庫 章2. SQL語言 2.1. 介紹 2.2. 概念 2.3. 創(chuàng)建新表 2.4. 向表中添加行 2.5. 查詢一個表 2.6. 表間鏈接 2.7. 聚集函數(shù) 2.8. 更新 2.9. 刪除 章3. 高級特性 3.1. 介紹 3.2. 視圖 3.3. 外鍵 3.4. 事務(wù) 3.5. 窗口函數(shù) 3.6. 繼承 3.7. 結(jié)論 II. SQL語言 章4. SQL語法 4.1. 詞法結(jié)構(gòu) 4.2. 值表達(dá)式 4.3. 調(diào)用函數(shù) 章5. 數(shù)據(jù)定義 5.1. 表的基本概念 5.2. 缺省值 5.3. 約束 5.4. 系統(tǒng)字段 5.5. 修改表 5.6. 權(quán)限 5.7. 模式 5.8. 繼承 5.9. 分區(qū) 5.10. 其它數(shù)據(jù)庫對象 5.11. 依賴性跟蹤 章 6. 數(shù)據(jù)操作 6.1. 插入數(shù)據(jù) 6.2. 更新數(shù)據(jù) 6.3. 刪除數(shù)據(jù) 章7. 查詢 7.1. 概述 7.2. 表表達(dá)式 7.3. 選擇列表 7.4. 組合查詢 7.5. 行排序 7.6. LIMIT和OFFSET 7.7. VALUES列表 7.8. WITH的查詢(公用表表達(dá)式) 章8. 數(shù)據(jù)類型 8.1. 數(shù)值類型 8.2. 貨幣類型 8.3. 字符類型 8.4. 二進(jìn)制數(shù)據(jù)類型 8.5. 日期/時間類型 8.6. 布爾類型 8.7. 枚舉類型 8.8. 幾何類型 8.9. 網(wǎng)絡(luò)地址類型 8.10. 位串類型 8.11. 文本搜索類型 8.12. UUID類型 8.13. XML類型 8.14. 數(shù)組 8.15. 復(fù)合類型 8.16. 對象標(biāo)識符類型 8.17. 偽類型 章 9. 函數(shù)和操作符 9.1. 邏輯操作符 9.2. 比較操作符 9.3. 數(shù)學(xué)函數(shù)和操作符 9.4. 字符串函數(shù)和操作符 9.5. 二進(jìn)制字符串函數(shù)和操作符 9.6. 位串函數(shù)和操作符 9.7. 模式匹配 9.8. 數(shù)據(jù)類型格式化函數(shù) 9.9. 時間/日期函數(shù)和操作符 9.10. 支持枚舉函數(shù) 9.11. 幾何函數(shù)和操作符 9.12. 網(wǎng)絡(luò)地址函數(shù)和操作符 9.13. 文本檢索函數(shù)和操作符 9.14. XML函數(shù) 9.15. 序列操作函數(shù) 9.16. 條件表達(dá)式 9.17. 數(shù)組函數(shù)和操作符 9.18. 聚合函數(shù) 9.19. 窗口函數(shù) 9.20. 子查詢表達(dá)式 9.21. 行和數(shù)組比較 9.22. 返回集合的函數(shù) 9.23. 系統(tǒng)信息函數(shù) 9.24. 系統(tǒng)管理函數(shù) 9.25. 觸發(fā)器函數(shù) 章10. 類型轉(zhuǎn)換 10.3. 函數(shù) 10.2. 操作符 10.1. 概述 10.4. 值存儲 10.5. UNION 章11. 索引 11.1. 介紹 11.2. 索引類型 11.3. 多字段索引 11.4. 索引和ORDER BY 11.5. 組合多個索引 11.6. 唯一索引 11.7. 表達(dá)式上的索引 11.8. 部分索引 11.9. 操作類和操作簇 11.10. 檢查索引的使用 章12. Full Text Search 12.1. Introduction 12.2. Tables and Indexes 12.3. Controlling Text Search 12.4. Additional Features 12.5. Parsers 12.6. Dictionaries 12.7. Configuration Example 12.8. Testing and Debugging Text Search 12.9. GiST and GIN Index Types 12.10. psql Support 12.11. Limitations 12.12. Migration from Pre-8.3 Text Search 章13. 并發(fā)控制 13.1. 介紹 13.2. 事務(wù)隔離 13.3. 明確鎖定 13.4. 應(yīng)用層數(shù)據(jù)完整性檢查 13.5. 鎖和索引 章14. 性能提升技巧 14.1. 使用EXPLAIN 14.2. 規(guī)劃器使用的統(tǒng)計信息 14.3. 用明確的JOIN語句控制規(guī)劃器 14.4. 向數(shù)據(jù)庫中添加記錄 14.5. 非持久性設(shè)置 III. 服務(wù)器管理 章15. 安裝指導(dǎo) 15.1. 簡版 15.2. 要求 15.3. 獲取源碼 15.4. 升級 15.5. 安裝過程 15.6. 安裝后的設(shè)置 15.7. 支持的平臺 15.8. 特殊平臺的要求 章16. Installation from Source Code on Windows 16.1. Building with Visual C++ or the Platform SDK 16.2. Building libpq with Visual C++ or Borland C++ 章17. 服務(wù)器安裝和操作 17.1. PostgreSQL用戶帳戶 17.2. 創(chuàng)建數(shù)據(jù)庫集群 17.3. 啟動數(shù)據(jù)庫服務(wù)器 17.4. 管理內(nèi)核資源 17.5. 關(guān)閉服務(wù) 17.6. 防止服務(wù)器欺騙 17.7. 加密選項 17.8. 用SSL進(jìn)行安全的TCP/IP連接 17.9. Secure TCP/IP Connections with SSH Tunnels 章18. 服務(wù)器配置 18.1. 設(shè)置參數(shù) 18.2. 文件位置 18.3. 連接和認(rèn)證 18.4. 資源消耗 18.5. 預(yù)寫式日志 18.6. 查詢規(guī)劃 18.7. 錯誤報告和日志 18.8. 運行時統(tǒng)計 18.9. 自動清理 18.10. 客戶端連接缺省 18.12. 版本和平臺兼容性 18.11. 鎖管理 18.13. 預(yù)置選項 18.14. 自定義的選項 18.15. 開發(fā)人員選項 18.16. 短選項 章19. 用戶認(rèn)證 19.1. pg_hba.conf 文件 19.2. 用戶名映射 19.3. 認(rèn)證方法 19.4. 用戶認(rèn)證 章20. 數(shù)據(jù)庫角色和權(quán)限 20.1. 數(shù)據(jù)庫角色 20.2. 角色屬性 20.3. 權(quán)限 20.4. 角色成員 20.5. 函數(shù)和觸發(fā)器 章21. 管理數(shù)據(jù)庫 21.1. 概述 21.2. 創(chuàng)建一個數(shù)據(jù)庫 21.3. 臨時庫 21.4. 數(shù)據(jù)庫配置 21.5. 刪除數(shù)據(jù)庫 21.6. 表空間 章22. 本土化 22.1. 區(qū)域支持 22.2. 字符集支持 章23. 日常數(shù)據(jù)庫維護(hù)工作 23.1. Routine Vacuuming日常清理 23.2. 經(jīng)常重建索引 23.3. 日志文件維護(hù) 章24. 備份和恢復(fù) 24.1. SQL轉(zhuǎn)儲 24.2. 文件系統(tǒng)級別的備份 24.3. 在線備份以及即時恢復(fù)(PITR) 24.4. 版本間遷移 章25. 高可用性與負(fù)載均衡,復(fù)制 25.1. 不同解決方案的比較 25.2. 日志傳送備份服務(wù)器 25.3. 失效切換 25.4. 日志傳送的替代方法 25.5. 熱備 章26. 恢復(fù)配置 26.1. 歸檔恢復(fù)設(shè)置 26.2. 恢復(fù)目標(biāo)設(shè)置 26.3. 備服務(wù)器設(shè)置 章27. 監(jiān)控數(shù)據(jù)庫的活動 27.1. 標(biāo)準(zhǔn)Unix工具 27.2. 統(tǒng)計收集器 27.3. 查看鎖 27.4. 動態(tài)跟蹤 章28. 監(jiān)控磁盤使用情況 28.1. 判斷磁盤的使用量 28.2. 磁盤滿導(dǎo)致的失效 章29. 可靠性和預(yù)寫式日志 29.1. 可靠性 29.2. 預(yù)寫式日志(WAL) 29.3. 異步提交 29.4. WAL配置 29.5. WAL內(nèi)部 章30. Regression Tests 30.1. Running the Tests 30.2. Test Evaluation 30.3. Variant Comparison Files 30.4. Test Coverage Examination IV. 客戶端接口 章31. libpq-C庫 31.1. 數(shù)據(jù)庫聯(lián)接函數(shù) 31.2. 連接狀態(tài)函數(shù) 31.3. 命令執(zhí)行函數(shù) 31.4. 異步命令處理 31.5. 取消正在處理的查詢 31.6. 捷徑接口 31.7. 異步通知 31.8. 與COPY命令相關(guān)的函數(shù) 31.9. Control Functions 控制函數(shù) 31.10. 其他函數(shù) 31.11. 注意信息處理 31.12. 事件系統(tǒng) 31.13. 環(huán)境變量 31.14. 口令文件 31.15. 連接服務(wù)的文件 31.16. LDAP查找連接參數(shù) 31.17. SSL支持 31.18. 在多線程程序里的行為 31.19. 制作libpq程序 31.20. 例子程序 章32. 大對象 32.1. 介紹 32.2. 實現(xiàn)特點 32.3. 客戶端接口 32.4. 服務(wù)器端函數(shù) 32.5. 例子程序 章33. ECPG - Embedded SQL in C 33.1. The Concept 33.2. Connecting to the Database Server 33.3. Closing a Connection 33.4. Running SQL Commands 33.5. Choosing a Connection 33.6. Using Host Variables 33.7. Dynamic SQL 33.8. pgtypes library 33.9. Using Descriptor Areas 33.10. Informix compatibility mode 33.11. Error Handling 33.12. Preprocessor directives 33.13. Processing Embedded SQL Programs 33.14. Library Functions 33.15. Internals 章34. 信息模式 34.1. 關(guān)于這個模式 34.2. 數(shù)據(jù)類型 34.3. information_schema_catalog_name 34.4. administrable_role_authorizations 34.5. applicable_roles 34.6. attributes 34.7. check_constraint_routine_usage 34.8. check_constraints 34.9. column_domain_usage 34.10. column_privileges 34.11. column_udt_usage 34.12. 字段 34.13. constraint_column_usage 34.14. constraint_table_usage 34.15. data_type_privileges 34.16. domain_constraints 34.18. domains 34.17. domain_udt_usage 34.19. element_types 34.20. enabled_roles 34.21. foreign_data_wrapper_options 34.22. foreign_data_wrappers 34.23. foreign_server_options 34.24. foreign_servers 34.25. key_column_usage 34.26. parameters 34.27. referential_constraints 34.28. role_column_grants 34.29. role_routine_grants 34.30. role_table_grants 34.31. role_usage_grants 34.32. routine_privileges 34.33. routines 34.34. schemata 34.35. sequences 34.36. sql_features 34.37. sql_implementation_info 34.38. sql_languages 34.39. sql_packages 34.40. sql_parts 34.41. sql_sizing 34.42. sql_sizing_profiles 34.43. table_constraints 34.44. table_privileges 34.45. tables 34.46. triggered_update_columns 34.47. 觸發(fā)器 34.48. usage_privileges 34.49. user_mapping_options 34.50. user_mappings 34.51. view_column_usage 34.52. view_routine_usage 34.53. view_table_usage 34.54. 視圖 V. 服務(wù)器端編程 章35. 擴(kuò)展SQL 35.1. 擴(kuò)展性是如何實現(xiàn)的 35.2. PostgreSQL類型系統(tǒng) 35.3. User-Defined Functions 35.4. Query Language (SQL) Functions 35.5. Function Overloading 35.6. Function Volatility Categories 35.7. Procedural Language Functions 35.8. Internal Functions 35.9. C-Language Functions 35.10. User-Defined Aggregates 35.11. User-Defined Types 35.12. User-Defined Operators 35.13. Operator Optimization Information 35.14. Interfacing Extensions To Indexes 35.15. 用C++擴(kuò)展 章36. 觸發(fā)器 36.1. 觸發(fā)器行為概述 36.3. 用 C 寫觸發(fā)器 36.2. 數(shù)據(jù)改變的可視性 36.4. 一個完整的例子 章37. 規(guī)則系統(tǒng) 37.1. The Query Tree 37.2. 視圖和規(guī)則系統(tǒng) 37.3. 在INSERT,UPDATE和DELETE上的規(guī)則 37.4. 規(guī)則和權(quán)限 37.5. 規(guī)則和命令狀態(tài) 37.6. 規(guī)則與觸發(fā)器得比較 章38. Procedural Languages 38.1. Installing Procedural Languages 章39. PL/pgSQL - SQL過程語言 39.1. 概述 39.2. PL/pgSQL的結(jié)構(gòu) 39.3. 聲明 39.4. 表達(dá)式 39.5. 基本語句 39.6. 控制結(jié)構(gòu) 39.7. 游標(biāo) 39.8. 錯誤和消息 39.9. 觸發(fā)器過程 39.10. PL/pgSQL Under the Hood 39.11. 開發(fā)PL/pgSQL的一些提示 39.12. 從OraclePL/SQL 進(jìn)行移植 章40. PL/Tcl - Tcl Procedural Language 40.1. Overview 40.2. PL/Tcl Functions and Arguments 40.3. Data Values in PL/Tcl 40.4. Global Data in PL/Tcl 40.5. Database Access from PL/Tcl 40.6. Trigger Procedures in PL/Tcl 40.7. Modules and the unknown command 40.8. Tcl Procedure Names 章41. PL/Perl - Perl Procedural Language 41.1. PL/Perl Functions and Arguments 41.2. Data Values in PL/Perl 41.3. Built-in Functions 41.4. Global Values in PL/Perl 41.6. PL/Perl Triggers 41.5. Trusted and Untrusted PL/Perl 41.7. PL/Perl Under the Hood 章42. PL/Python - Python Procedural Language 42.1. Python 2 vs. Python 3 42.2. PL/Python Functions 42.3. Data Values 42.4. Sharing Data 42.5. Anonymous Code Blocks 42.6. Trigger Functions 42.7. Database Access 42.8. Utility Functions 42.9. Environment Variables 章43. Server Programming Interface 43.1. Interface Functions Spi-spi-connect Spi-spi-finish Spi-spi-push Spi-spi-pop Spi-spi-execute Spi-spi-exec Spi-spi-execute-with-args Spi-spi-prepare Spi-spi-prepare-cursor Spi-spi-prepare-params Spi-spi-getargcount Spi-spi-getargtypeid Spi-spi-is-cursor-plan Spi-spi-execute-plan Spi-spi-execute-plan-with-paramlist Spi-spi-execp Spi-spi-cursor-open Spi-spi-cursor-open-with-args Spi-spi-cursor-open-with-paramlist Spi-spi-cursor-find Spi-spi-cursor-fetch Spi-spi-cursor-move Spi-spi-scroll-cursor-fetch Spi-spi-scroll-cursor-move Spi-spi-cursor-close Spi-spi-saveplan 43.2. Interface Support Functions Spi-spi-fname Spi-spi-fnumber Spi-spi-getvalue Spi-spi-getbinval Spi-spi-gettype Spi-spi-gettypeid Spi-spi-getrelname Spi-spi-getnspname 43.3. Memory Management Spi-spi-palloc Spi-realloc Spi-spi-pfree Spi-spi-copytuple Spi-spi-returntuple Spi-spi-modifytuple Spi-spi-freetuple Spi-spi-freetupletable Spi-spi-freeplan 43.4. Visibility of Data Changes 43.5. Examples VI. 參考手冊 I. SQL命令 Sql-abort Sql-alteraggregate Sql-alterconversion Sql-alterdatabase Sql-alterdefaultprivileges Sql-alterdomain Sql-alterforeigndatawrapper Sql-alterfunction Sql-altergroup Sql-alterindex Sql-alterlanguage Sql-alterlargeobject Sql-alteroperator Sql-alteropclass Sql-alteropfamily Sql-alterrole Sql-alterschema Sql-altersequence Sql-alterserver Sql-altertable Sql-altertablespace Sql-altertsconfig Sql-altertsdictionary Sql-altertsparser Sql-altertstemplate Sql-altertrigger Sql-altertype Sql-alteruser Sql-alterusermapping Sql-alterview Sql-analyze Sql-begin Sql-checkpoint Sql-close Sql-cluster Sql-comment Sql-commit Sql-commit-prepared Sql-copy Sql-createaggregate Sql-createcast Sql-createconstraint Sql-createconversion Sql-createdatabase Sql-createdomain Sql-createforeigndatawrapper Sql-createfunction Sql-creategroup Sql-createindex Sql-createlanguage Sql-createoperator Sql-createopclass Sql-createopfamily Sql-createrole Sql-createrule Sql-createschema Sql-createsequence Sql-createserver Sql-createtable Sql-createtableas Sql-createtablespace Sql-createtsconfig Sql-createtsdictionary Sql-createtsparser Sql-createtstemplate Sql-createtrigger Sql-createtype Sql-createuser Sql-createusermapping Sql-createview Sql-deallocate Sql-declare Sql-delete Sql-discard Sql-do Sql-dropaggregate Sql-dropcast Sql-dropconversion Sql-dropdatabase Sql-dropdomain Sql-dropforeigndatawrapper Sql-dropfunction Sql-dropgroup Sql-dropindex Sql-droplanguage Sql-dropoperator Sql-dropopclass Sql-dropopfamily Sql-drop-owned Sql-droprole Sql-droprule Sql-dropschema Sql-dropsequence Sql-dropserver Sql-droptable Sql-droptablespace Sql-droptsconfig Sql-droptsdictionary Sql-droptsparser Sql-droptstemplate Sql-droptrigger Sql-droptype Sql-dropuser Sql-dropusermapping Sql-dropview Sql-end Sql-execute Sql-explain Sql-fetch Sql-grant Sql-insert Sql-listen Sql-load Sql-lock Sql-move Sql-notify Sql-prepare Sql-prepare-transaction Sql-reassign-owned Sql-reindex Sql-release-savepoint Sql-reset Sql-revoke Sql-rollback Sql-rollback-prepared Sql-rollback-to Sql-savepoint Sql-select Sql-selectinto Sql-set Sql-set-constraints Sql-set-role Sql-set-session-authorization Sql-set-transaction Sql-show Sql-start-transaction Sql-truncate Sql-unlisten Sql-update Sql-vacuum Sql-values II. 客戶端應(yīng)用程序 App-clusterdb App-createdb App-createlang App-createuser App-dropdb App-droplang App-dropuser App-ecpg App-pgconfig App-pgdump App-pg-dumpall App-pgrestore App-psql App-reindexdb App-vacuumdb III. PostgreSQL服務(wù)器應(yīng)用程序 App-initdb App-pgcontroldata App-pg-ctl App-pgresetxlog App-postgres App-postmaster VII. 內(nèi)部 章44. PostgreSQL內(nèi)部概覽 44.1. 查詢路徑 44.2. 連接是如何建立起來的 44.3. 分析器階段 44.4. ThePostgreSQL規(guī)則系統(tǒng) 44.5. 規(guī)劃器/優(yōu)化器 44.6. 執(zhí)行器 章45. 系統(tǒng)表 45.1. 概述 45.2. pg_aggregate 45.3. pg_am 45.4. pg_amop 45.5. pg_amproc 45.6. pg_attrdef 45.7. pg_attribute 45.8. pg_authid 45.9. pg_auth_members 45.10. pg_cast 45.11. pg_class 45.12. pg_constraint 45.13. pg_conversion 45.14. pg_database 45.15. pg_db_role_setting 45.16. pg_default_acl 45.17. pg_depend 45.18. pg_description 45.19. pg_enum 45.20. pg_foreign_data_wrapper 45.21. pg_foreign_server 45.22. pg_index 45.23. pg_inherits 45.24. pg_language 45.25. pg_largeobject 45.26. pg_largeobject_metadata 45.27. pg_namespace 45.28. pg_opclass 45.29. pg_operator 45.30. pg_opfamily 45.31. pg_pltemplate 45.32. pg_proc 45.33. pg_rewrite 45.34. pg_shdepend 45.35. pg_shdescription 45.36. pg_statistic 45.37. pg_tablespace 45.38. pg_trigger 45.39. pg_ts_config 45.40. pg_ts_config_map 45.41. pg_ts_dict 45.42. pg_ts_parser 45.43. pg_ts_template 45.44. pg_type 45.45. pg_user_mapping 45.46. System Views 45.47. pg_cursors 45.48. pg_group 45.49. pg_indexes 45.50. pg_locks 45.51. pg_prepared_statements 45.52. pg_prepared_xacts 45.53. pg_roles 45.54. pg_rules 45.55. pg_settings 45.56. pg_shadow 45.57. pg_stats 45.58. pg_tables 45.59. pg_timezone_abbrevs 45.60. pg_timezone_names 45.61. pg_user 45.62. pg_user_mappings 45.63. pg_views 章46. Frontend/Backend Protocol 46.1. Overview 46.2. Message Flow 46.3. Streaming Replication Protocol 46.4. Message Data Types 46.5. Message Formats 46.6. Error and Notice Message Fields 46.7. Summary of Changes since Protocol 2.0 47. PostgreSQL Coding Conventions 47.1. Formatting 47.2. Reporting Errors Within the Server 47.3. Error Message Style Guide 章48. Native Language Support 48.1. For the Translator 48.2. For the Programmer 章49. Writing A Procedural Language Handler 章50. Genetic Query Optimizer 50.1. Query Handling as a Complex Optimization Problem 50.2. Genetic Algorithms 50.3. Genetic Query Optimization (GEQO) in PostgreSQL 50.4. Further Reading 章51. 索引訪問方法接口定義 51.1. 索引的系統(tǒng)表記錄 51.2. 索引訪問方法函數(shù) 51.3. 索引掃描 51.4. 索引鎖的考量 51.5. 索引唯一性檢查 51.6. 索引開銷估計函數(shù) 章52. GiST Indexes 52.1. Introduction 52.2. Extensibility 52.3. Implementation 52.4. Examples 52.5. Crash Recovery 章53. GIN Indexes 53.1. Introduction 53.2. Extensibility 53.3. Implementation 53.4. GIN tips and tricks 53.5. Limitations 53.6. Examples 章54. 數(shù)據(jù)庫物理存儲 54.1. 數(shù)據(jù)庫文件布局 54.2. TOAST 54.3. 自由空間映射 54.4. 可見映射 54.5. 數(shù)據(jù)庫分頁文件 章55. BKI后端接口 55.1. BKI 文件格式 55.2. BKI命令 55.3. 系統(tǒng)初始化的BKI文件的結(jié)構(gòu) 55.4. 例子 章56. 規(guī)劃器如何使用統(tǒng)計信息 56.1. 行預(yù)期的例子 VIII. 附錄 A. PostgreSQL錯誤代碼 B. 日期/時間支持 B.1. 日期/時間輸入解析 B.2. 日期/時間關(guān)鍵字 B.3. 日期/時間配置文件 B.4. 日期單位的歷史 C. SQL關(guān)鍵字 D. SQL Conformance D.1. Supported Features D.2. Unsupported Features E. Release Notes Release-0-01 Release-0-02 Release-0-03 Release-1-0 Release-1-01 Release-1-02 Release-1-09 Release-6-0 Release-6-1 Release-6-1-1 Release-6-2 Release-6-2-1 Release-6-3 Release-6-3-1 Release-6-3-2 Release-6-4 Release-6-4-1 Release-6-4-2 Release-6-5 Release-6-5-1 Release-6-5-2 Release-6-5-3 Release-7-0 Release-7-0-1 Release-7-0-2 Release-7-0-3 Release-7-1 Release-7-1-1 Release-7-1-2 Release-7-1-3 Release-7-2 Release-7-2-1 Release-7-2-2 Release-7-2-3 Release-7-2-4 Release-7-2-5 Release-7-2-6 Release-7-2-7 Release-7-2-8 Release-7-3 Release-7-3-1 Release-7-3-10 Release-7-3-11 Release-7-3-12 Release-7-3-13 Release-7-3-14 Release-7-3-15 Release-7-3-16 Release-7-3-17 Release-7-3-18 Release-7-3-19 Release-7-3-2 Release-7-3-20 Release-7-3-21 Release-7-3-3 Release-7-3-4 Release-7-3-5 Release-7-3-6 Release-7-3-7 Release-7-3-8 Release-7-3-9 Release-7-4 Release-7-4-1 Release-7-4-10 Release-7-4-11 Release-7-4-12 Release-7-4-13 Release-7-4-14 Release-7-4-15 Release-7-4-16 Release-7-4-17 Release-7-4-18 Release-7-4-19 Release-7-4-2 Release-7-4-20 Release-7-4-21 Release-7-4-22 Release-7-4-23 Release-7-4-24 Release-7-4-25 Release-7-4-26 Release-7-4-27 Release-7-4-28 Release-7-4-29 Release-7-4-3 Release-7-4-30 Release-7-4-4 Release-7-4-5 Release-7-4-6 Release-7-4-7 Release-7-4-8 Release-7-4-9 Release-8-0 Release-8-0-1 Release-8-0-10 Release-8-0-11 Release-8-0-12 Release-8-0-13 Release-8-0-14 Release-8-0-15 Release-8-0-16 Release-8-0-17 Release-8-0-18 Release-8-0-19 Release-8-0-2 Release-8-0-20 Release-8-0-21 Release-8-0-22 Release-8-0-23 Release-8-0-24 Release-8-0-25 Release-8-0-26 Release-8-0-3 Release-8-0-4 Release-8-0-5 Release-8-0-6 Release-8-0-7 Release-8-0-8 Release-8-0-9 Release-8-1 Release-8-1-1 Release-8-1-10 Release-8-1-11 Release-8-1-12 Release-8-1-13 Release-8-1-14 Release-8-1-15 Release-8-1-16 Release-8-1-17 Release-8-1-18 Release-8-1-19 Release-8-1-2 Release-8-1-20 Release-8-1-21 Release-8-1-22 Release-8-1-23 Release-8-1-3 Release-8-1-4 Release-8-1-5 Release-8-1-6 Release-8-1-7 Release-8-1-8 Release-8-1-9 Release-8-2 Release-8-2-1 Release-8-2-10 Release-8-2-11 Release-8-2-12 Release-8-2-13 Release-8-2-14 Release-8-2-15 Release-8-2-16 Release-8-2-17 Release-8-2-18 Release-8-2-19 Release-8-2-2 Release-8-2-20 Release-8-2-21 Release-8-2-3 Release-8-2-4 Release-8-2-5 Release-8-2-6 Release-8-2-7 Release-8-2-8 Release-8-2-9 Release-8-3 Release-8-3-1 Release-8-3-10 Release-8-3-11 Release-8-3-12 Release-8-3-13 Release-8-3-14 Release-8-3-15 Release-8-3-2 Release-8-3-3 Release-8-3-4 Release-8-3-5 Release-8-3-6 Release-8-3-7 Release-8-3-8 Release-8-3-9 Release-8-4 Release-8-4-1 Release-8-4-2 Release-8-4-3 Release-8-4-4 Release-8-4-5 Release-8-4-6 Release-8-4-7 Release-8-4-8 Release-9-0 Release-9-0-1 Release-9-0-2 Release-9-0-3 Release-9-0-4 F. 額外提供的模塊 F.1. adminpack F.2. auto_explain F.3. btree_gin F.4. btree_gist F.5. chkpass F.6. citext F.7. cube F.8. dblink Contrib-dblink-connect Contrib-dblink-connect-u Contrib-dblink-disconnect Contrib-dblink Contrib-dblink-exec Contrib-dblink-open Contrib-dblink-fetch Contrib-dblink-close Contrib-dblink-get-connections Contrib-dblink-error-message Contrib-dblink-send-query Contrib-dblink-is-busy Contrib-dblink-get-notify Contrib-dblink-get-result Contrib-dblink-cancel-query Contrib-dblink-get-pkey Contrib-dblink-build-sql-insert Contrib-dblink-build-sql-delete Contrib-dblink-build-sql-update F.9. dict_int F.10. dict_xsyn F.11. earthdistance F.12. fuzzystrmatch F.13. hstore F.14. intagg F.15. intarray F.16. isn F.17. lo F.18. ltree F.19. oid2name F.20. pageinspect F.21. passwordcheck F.22. pg_archivecleanup F.23. pgbench F.24. pg_buffercache F.25. pgcrypto F.26. pg_freespacemap F.27. pgrowlocks F.28. pg_standby F.29. pg_stat_statements F.30. pgstattuple F.31. pg_trgm F.32. pg_upgrade F.33. seg F.34. spi F.35. sslinfo F.36. tablefunc F.37. test_parser F.38. tsearch2 F.39. unaccent F.40. uuid-ossp F.41. vacuumlo F.42. xml2 G. 外部項目 G.1. 客戶端接口 G.2. 過程語言 G.3. 擴(kuò)展 H. The Source Code Repository H.1. Getting The Source Via Git I. 文檔 I.1. DocBook I.2. 工具集 I.3. 制作文檔 I.4. 文檔寫作 I.5. 風(fēng)格指導(dǎo) J. 首字母縮略詞 參考書目 Bookindex Index
文字

31.3. 命令執(zhí)行函數(shù)

一旦與數(shù)據(jù)庫服務(wù)器的連接成功建立,便可用這里描述的函數(shù)執(zhí)行SQL查詢和命令。

31.3.1. 主函數(shù)

PQexec

給服務(wù)器提交一條命令并且等待結(jié)果。

PGresult *PQexec(PGconn *conn,const char *command);

返回一個PGresult指針或者也可能是一個NULL指針。通常返回一個非空的指針, 除非沒有內(nèi)存或發(fā)生了象不能把命令發(fā)送到服務(wù)器這樣的嚴(yán)重錯誤。如果返回的是NULL, 它應(yīng)該被當(dāng)作PGRES_FATAL_ERROR結(jié)果處理。用PQerrorMessage獲取有關(guān)錯誤的更多信息。

我們可以在命令行字串里包含多個SQL命令(用分號分隔)。在一次PQexec調(diào)用中發(fā)送的多個查詢是在一 個事務(wù)里處理的,除非在查詢字串里有明確的BEGIN/COMMIT命令用于把整個字串分隔成多個事務(wù)。 請注意這樣返回的PGresult結(jié)構(gòu)只描述字串里執(zhí)行的最后一條命令的結(jié)果。如果有一個命令失敗, 那么字串處理的過程就會停止并且返回的PGresult會描述錯誤條件。

PQexecParams

向服務(wù)器提交一條命令并且等待結(jié)果,還有額外的傳遞與SQL命令文本獨立的參數(shù)的能力。

PGresult *PQexecParams(PGconn *conn,
                       const char *command,
                       int nParams,
                       const Oid *paramTypes,
                       const char * const *paramValues,
                       const int *paramLengths,
                       const int *paramFormats,
                       int resultFormat);

PQexecParams類似PQexec,但是提供了額外的功能:參數(shù)值可以獨立于命令串進(jìn)行聲明, 并且可以要求查詢結(jié)果的格式是文本或者二進(jìn)制格式。PQexecParams只是在協(xié)議3.0以及以后的版本中支持; 在使用2.0的版本的時候會失敗。

函數(shù)的參數(shù)是:

conn

連接對象通過發(fā)送命令。

command

要執(zhí)行的SQL命令字符串。如果使用參數(shù), 他們被稱為命令字符串作為$1, $2等等。

nParams

提供的參數(shù)數(shù)目;它是paramTypes[],paramValues[], paramLengths[],a和paramFormats[].數(shù)組的長度 ( 數(shù)組指針可以是NULL,當(dāng)nParams為零。)

paramTypes[]

通過OID,將聲明數(shù)據(jù)類型指定到參數(shù)標(biāo)記。如果paramTypesNULL, 或數(shù)組中任何的特定參數(shù)是0,服務(wù)器為參數(shù)標(biāo)記推斷數(shù)據(jù)類型,采用的方式與一個未定義類型 的文本字符串相同。

paramValues[]

聲明參數(shù)的實際值。在這個數(shù)組中的一個空指針表示相應(yīng)的參數(shù)是空; 要么指針指向一個以零結(jié)尾的文本字符串或以服務(wù)器希望的方式存在的二進(jìn)制數(shù)據(jù)。

paramLengths[]

為二進(jìn)制格式的參數(shù)聲明實際數(shù)據(jù)長度,該設(shè)置忽略空參數(shù)或文本格式的參數(shù)。 如果沒有二進(jìn)制參數(shù),那么數(shù)組指針可以為空。

paramFormats[]

聲明參數(shù)為一個文本(為相應(yīng)參數(shù)在數(shù)組條目中放置一個0)還是一個二進(jìn)制格式 (為相應(yīng)參數(shù)在一個數(shù)組條目中放置一個1)。 如果數(shù)組指針是空,那么所有參數(shù)被看做是文本字符串。

以二進(jìn)制格式傳遞的值需要能夠被后臺識別的內(nèi)部表示。 例如,整數(shù)必須以網(wǎng)絡(luò)字節(jié)順序來傳遞; 傳遞numeric時需要服務(wù)器存儲格式的識別,如在src/backend/utils/adt/numeric.c::numeric_send()src/backend/utils/adt/numeric.c::numeric_recv()中那樣。

resultFormat

聲明0用于以文本格式獲得結(jié)果,或1用于以二進(jìn)制格式獲得結(jié)果。 (目前沒有規(guī)定以不同的格式來獲取不同的結(jié)果列,即使底層協(xié)議中可能實現(xiàn))。

PQexecParamsPQexec主要優(yōu)勢是 參數(shù)值可以分開字符串命令,從而避免了繁瑣和容易出錯的需要 引用和逃逸。

PQexec不同的是,PQexecParams在一個給出的字串里最多允 許一個 SQL 命令。(里面可以有分號,但是不得超過一個非空的命令。)這是下層的協(xié)議的一個限制, 但是也有些額外的好處,比如可以有另外一層防止SQL攻擊的層次。

Tip: 提示: 通過OID聲明參數(shù)類型是非常煩瑣的,尤其是你不希望在你的程序里寫死特定的 OID 值的時候。 不過,你可以避免這么做,即使在服務(wù)器自己無法判斷參數(shù)類型,或者是選擇了一種與你預(yù)期不同的 參數(shù)類型的時候也一樣。在 SQL 命令文本里,給參數(shù)負(fù)號附加一個明確的類型轉(zhuǎn)換, 顯示你準(zhǔn)備發(fā)送的數(shù)據(jù)類型。比如:

SELECT * FROM mytable WHERE x = $1::bigint;

這樣強制參數(shù)$1當(dāng)作bigint看待,即使缺省情況下它會被賦予和x。一樣的類型。 在以二進(jìn)制格式發(fā)送參數(shù)值的時候,我們強烈建議通過這種方法或者是聲明數(shù)字類型OID的方法強制類型判斷, 因為二進(jìn)制格式比文本格式少一些冗余,因此服務(wù)器就會少一些機會捕捉類型的錯誤匹配。

PQprepare

用給定的參數(shù)提交請求,創(chuàng)建一個準(zhǔn)備好的語句,然后等待結(jié)束。

PGresult *PQprepare(PGconn *conn,
                    const char *stmtName,
                    const char *query,
                    int nParams,
                    const Oid *paramTypes);

PQprepare創(chuàng)建一個為后面PQexecPrepared執(zhí)行用的準(zhǔn)備好語句。這個特性允許那 些重復(fù)使用的語句只分析和規(guī)劃一次,而不是每次執(zhí)行都分析規(guī)劃。這個語句必須在當(dāng)前 會話的前面已經(jīng)準(zhǔn)備好。只是在協(xié)議3.0和以后的連接里支持PQprepare; 在使用2.0協(xié)議的時候,它會失敗。

這個函數(shù)從query字串里創(chuàng)建一個叫stmtName的準(zhǔn)備好的語句,query 必須只包含 一個 SQL 命令。stmtName可以是"",這樣就創(chuàng)建一個無名的語句,這種情況下,任何前面 存在的無名語句都會自動被代替;否則,如果語句名已經(jīng)在當(dāng)前會話里定義,那就是一個錯誤。 如果使用了參數(shù),那么在查詢里它們引用成$1,$2等等。nParams是參數(shù)的個數(shù),參數(shù)的類型在 數(shù)組paramTypes[]里事先聲明好了。(如果 nParams 是零,那么這個數(shù)組指針可以是NULL。) paramTypes[]. 用 OID 的方式聲明與參數(shù)符號關(guān)聯(lián)的數(shù)據(jù)類型。如果paramTypesNULL,或者數(shù)組中 某個特定元素是零,那么服務(wù)器將用處理無類型文本同樣的方法給這個參數(shù)符號賦予數(shù)據(jù)類型。還有, 查詢可以使用比 nParams 數(shù)值更大的參數(shù)符號編號;這些參數(shù)的數(shù)據(jù)類型也是用一樣的方法推導(dǎo)的。 (見 PQdescribePrepared作為一種手段,以找出> 什么樣的數(shù)據(jù)類型推斷。)

PQexec似,結(jié)果通常是一個PGresult對象,其內(nèi)容表明服務(wù)器端是成功還是失敗。 空的結(jié)果表示內(nèi)存耗盡或者完全不能發(fā)送命令。使用PQerrorMessage獲取有關(guān)這類錯誤的更多信息。

用于PQexecPrepared的準(zhǔn)備好語句也可以通過執(zhí)行 SQLPREPARE語句來創(chuàng)建。 (不過 PQprepare 更靈活,因為它不要求預(yù)先聲明參數(shù)類型。)還有,盡管沒有libpq函數(shù) 可以刪除一個準(zhǔn)備好語句,SQLDEALLOCATE語句卻可以刪除。

PQexecPrepared

發(fā)送一個請求,執(zhí)行一個帶有給出參數(shù)的準(zhǔn)備好的語句,并且等待結(jié)果。

PGresult *PQexecPrepared(PGconn *conn,
                         const char *stmtName,
                         int nParams,
                         const char * const *paramValues,
                         const int *paramLengths,
                         const int *paramFormats,
                         int resultFormat);

PQexecPreparedPQexecParams類似,但是要執(zhí)行的命令是通過命名一個前面準(zhǔn)備好的語句聲明的, 而不是給出一個查詢字串。這個特性允許那些要重復(fù)使用的命令只進(jìn)行一次分析和規(guī)劃, 而不是每次執(zhí)行都來一遍。PQexecPrepared只在協(xié)議 3.0 和以后的版本里支持; 在使用 2.0 版本的協(xié)議的時候,它們會失敗。

參數(shù)和PQexecParams一樣,只是給出的是一個準(zhǔn)備好語句的名字,而不是一個查詢字串, 并且沒有paramTypes[]參數(shù)(沒必要,因為準(zhǔn)備好語句的參數(shù)類型是在創(chuàng)建的時候確定的)。

PQdescribePrepared

提交請求以獲取有關(guān)指定的信息 準(zhǔn)備的聲明,并等待完成。

PGresult *PQdescribePrepared(PGconn *conn,const char *stmtName);

PQdescribePrepared允許應(yīng)用程序獲取 有關(guān)先前準(zhǔn)備的語句。PQdescribePrepared只在協(xié)議 3.0 和以后的版本里支持; 在使用 2.0 版本的協(xié)議的時候,它們會失敗。

stmtName可以是""NULL以指向未命名聲明, 要么必須與現(xiàn)有的預(yù)處理聲明同名,成功時,會返回一個帶有PGRES_COMMAND_OKPGresult。 可以在這個PGresult中使用PQnparamsPQparamtype函數(shù)以 獲得預(yù)處理聲明中的參數(shù)信息,同時PQnfieldsPQfname,PQftype 三個函數(shù)提供聲明的結(jié)果列的信息。

PQdescribePortal

提交請求以獲取有關(guān)指定的信息 門戶網(wǎng)站,并等待完成......

PGresult *PQdescribePortal(PGconn *conn,const char *portalName);

PQdescribePortal允許應(yīng)用程序獲得關(guān)于之前創(chuàng)建的端口的信息。 (libpq不提供與端口的直接連接,但可以使用這個函數(shù)來檢查 DECLARE CURSOR命令創(chuàng)建的游標(biāo)的屬性)。PQdescribePortal 只支持3.0及其之后的連接協(xié)議。

portalName可以是""NULL以指向未命名端口, 要么必須與現(xiàn)有的端口同名,成功時,會返回一個帶有PGRES_COMMAND_OKPGresult。 可以在這個PGresult中使用PQnfieldsPQfnamePQftype函數(shù)以 獲得端口的結(jié)果列的信息。

PGresult結(jié)構(gòu)封裝了服務(wù)器返回的結(jié)果。 libpq應(yīng)該小心維護(hù)PGresult的抽象。 使用下面的訪問函數(shù)獲取PGresult的內(nèi)容。 避免直接引用PGresult里面的字段 ,因為它們在未來版本里可能會被修改。

PQresultStatus

返回命令的結(jié)果狀態(tài)。

ExecStatusType PQresultStatus(const PGresult *res);

PQresultStatus可以返回下面數(shù)值之一:

PGRES_EMPTY_QUERY

發(fā)送給服務(wù)器的字串是空的

PGRES_COMMAND_OK

成功完成一個不返回數(shù)據(jù)的命令

PGRES_TUPLES_OK

成功執(zhí)行一個返回數(shù)據(jù)的查詢查詢(比如SELECT或者SHOW)。

PGRES_COPY_OUT

(從服務(wù)器)Copy Out (拷貝出)數(shù)據(jù)傳輸開始

PGRES_COPY_IN

Copy In(拷貝入)(到服務(wù)器)數(shù)據(jù)傳輸開始

PGRES_BAD_RESPONSE

服務(wù)器的響應(yīng)無法理解

PGRES_NONFATAL_ERROR

發(fā)生了一個非致命錯誤(通知或者警告)

PGRES_FATAL_ERROR

發(fā)生了一個致命錯誤

如果結(jié)果狀態(tài)是PGRES_TUPLES_OK,那么可以用下面的函數(shù)從查詢的返回中抽取元組信息。 注意一個碰巧檢索了零條元組的SELECT仍然顯示PGRES_TUPLES_OKPGRES_COMMAND_OK 用于不返回元組的命令(INSERTUPDATE等)。返回PGRES_EMPTY_QUERY 的響應(yīng)通常意味著暴露了客戶端軟件里面的臭蟲。

狀態(tài)為PGRES_NONFATAL_ERROR的結(jié)果永遠(yuǎn)不會直接由PQexec或者其它查詢執(zhí)行函數(shù)返回; 這類的結(jié)果會被傳遞給通知處理器(參閱Section 31.11)。

PQresStatus

把PPQresultStatus返回的枚舉類型轉(zhuǎn)換成一個描述狀態(tài)碼的字符串常量。 調(diào)用者不應(yīng)該釋放結(jié)果。

char *PQresStatus(ExecStatusType status);

PQresultErrorMessage

返回與查詢關(guān)聯(lián)的錯誤信息,或在沒有錯誤時返回一個空字符串。

char *PQresultErrorMessage(const PGresult *res);

如果有錯誤,那么返回的字串將包括一個結(jié)尾的新行。調(diào)用者不應(yīng)該直接釋放結(jié)果。 在相關(guān)的PGresult句柄傳遞給PQclear之后,它會自動釋放。

緊跟在一個PQexecPQgetResult調(diào)用后面,PQerrorMessage(對連接)將返回 與PQresultErrorMessage(對結(jié)果)一樣的字符串。不過,一個PGresult將保有其錯誤信息直到被刪除, 而連結(jié)的錯誤信息將在后續(xù)的操作完成時被改變。當(dāng)你想知道與某個PGresult相關(guān)聯(lián)的狀態(tài)時 用PQresultErrorMessage;當(dāng)你想知道與連接的最近一個操作相關(guān)聯(lián)的狀態(tài)時用PQerrorMessage

PQresultErrorField

返回一個獨立的錯誤報告字段。

char *PQresultErrorField(const PGresult *res,int fieldcode);

fieldcode是一個錯誤字段標(biāo)識符;參閱下面列出的符號。如果PGresult不是錯誤或者警告結(jié) 果或者不包括指定的字段,那么返回NULL。字段值通常將不包括結(jié)尾的新行。調(diào)用者不應(yīng)該直接釋放結(jié)果。 在相關(guān)聯(lián)的PGresult句柄傳遞給PQclear之后,它將被自動釋放。

The following field codes are available: 下列代碼是可用的:

PG_DIAG_SEVERITY

嚴(yán)重程度,這個字段的內(nèi)容是ERRORFATAL或者PANIC(在錯誤信息里), 或者WARNINGNOTICE,DEBUGINFOLOG(在注意信息里), 或者是這些東西的一個本地化翻譯。總是出現(xiàn)。 PG_DIAG_SQLSTATE

PG_DIAG_SQLSTATE

這個錯誤的 SQLSTATE 代碼。SQLSTATE 代碼表示所發(fā)生的錯誤的類型; 可以由前端應(yīng)用用于對特定的數(shù)據(jù)庫錯誤執(zhí)行特定的操作(比如錯誤處理)。關(guān)于可能 的 SQLSTATE 代碼的列表,請參閱Appendix A。這個字段是不能區(qū)域化的,并且總是出現(xiàn)。

PG_DIAG_MESSAGE_PRIMARY

主要的人類可讀錯誤的信息(通常一條線)。 Always present.

PG_DIAG_MESSAGE_DETAIL

細(xì)節(jié):一個可選的從屬錯誤信息,里面有更多有關(guān)該問題的細(xì)節(jié)??赡苡卸嘈?。

PG_DIAG_MESSAGE_HINT

提示:一個可選的有關(guān)如何處理該問題的建議。它和細(xì)節(jié)的區(qū)別是它提供了建議 (可能不太合適)而不光是事實??赡苡泻脦仔?。

PG_DIAG_STATEMENT_POSITION

一個包含十進(jìn)制整數(shù)的字串,當(dāng)作一個錯誤游標(biāo)使用,指出最初的語句串出錯的地方的下標(biāo)。 第一個字符的索引是 1,并且這個位置是用字符計,而不是用字節(jié)計。

PG_DIAG_INTERNAL_POSITION

這個和PG_DIAG_STATEMENT_POSITION字段定義是一樣的,區(qū)別是它用于內(nèi)部生成的命令的下標(biāo)指示, 而不是客戶端提交的命令。如果出現(xiàn)了這個字段,那么PG_DIAG_INTERNAL_QUERY字段也總是出現(xiàn)。

PG_DIAG_INTERNAL_QUERY

一個失敗的內(nèi)部生成的命令的文本。比如,這個可能是一個 PL/pgSQL 函數(shù)發(fā)出的 SQL 查詢。

PG_DIAG_CONTEXT

一個指示器,表明錯誤發(fā)生的環(huán)境。目前這個包括活躍的過程語言函數(shù)和內(nèi)部生成的查詢的調(diào)用堆棧。 堆棧是每行一條,最近的在上面。

PG_DIAG_SOURCE_FILE

所報告的錯誤的源代碼位置的所在文件。

PG_DIAG_SOURCE_LINE

報告的這個錯誤所在的源代碼位置的行號。

PG_DIAG_SOURCE_FUNCTION

報告這個錯誤的源代碼函數(shù)的名字。

按照自身的要求格式化顯示信息是客戶端的責(zé)任;特別是根據(jù)需要對長行進(jìn)行折行。在錯誤信息字段里出現(xiàn)的新行字符應(yīng)該當(dāng)作分段符號,而不是換行。

libpq生成的錯誤將會有嚴(yán)重性和主信息,但是通常沒有其它字段。3.0 協(xié)議之前返回的錯誤 將包含嚴(yán)重性和主信息,有時候還有詳細(xì)信息,但是沒有其它字段。

請注意這些錯誤字段只能從PGresult對象里獲得, 而不是PGconn對象;沒有PQerrorField函數(shù)。

PQclear

PQclear釋放于PGresult相關(guān)聯(lián)的存儲空間。 任何不再需要的查詢結(jié)果在不需要的時候都應(yīng)該用PQclear釋放掉。

void PQclear(PGresult *res);

只要你需要,你可以保留PGresult對象任意長的時間; 當(dāng)你提交新的查詢時它并不消失, 甚至你斷開連接后也是這樣。要刪除它,你必須調(diào)用PQclear。 不這么做將導(dǎo)致你的應(yīng)用中的內(nèi)存泄漏。

31.3.2. Retrieving Query Result Information檢索查詢結(jié)果信息

這些函數(shù)用于從一個代表著成功查詢結(jié)果(也就是說,狀態(tài)為PGRES_TUPLES_OK的查詢)的PGresult對象。 對于其它狀態(tài)值的對象,他們的行為會好像他們有零行和零列一樣。

PQntuples

返回查詢結(jié)果里的行(元組)個數(shù)。因為在32位操作系統(tǒng) 它返回一個整數(shù)的結(jié)果,大型結(jié)果集可能溢出返回值。

int PQntuples(const PGresult *res);

PQnfields

返回查詢結(jié)果里數(shù)據(jù)行的數(shù)據(jù)域(字段)的個數(shù)。

int PQnfields(const PGresult *res);

PQfname

返回與給出的數(shù)據(jù)域編號相關(guān)聯(lián)的數(shù)據(jù)域(字段)的名稱。數(shù)據(jù)域編號從 0 開始。 調(diào)用者不應(yīng)該直接釋放結(jié)果。在相關(guān)聯(lián)的PGresult 句柄傳遞給PQclear之后,結(jié)果會被自動釋放。

char *PQfname(const PGresult *res,
              int column_number);

如果字段編號超出范圍,那么返回NULL

PQfnumber

返回與給出的數(shù)據(jù)域名稱相關(guān)聯(lián)的數(shù)據(jù)域(字段)的編號。

int PQfnumber(const PGresult *res,
              const char *column_name);

如果給出的名字不匹配任何字段,返回 -1。

給出的名字是當(dāng)作 SQL 命令里的一個標(biāo)識符看待的,也就是說,如果沒有加雙引號, 那么會轉(zhuǎn)換為小寫。比如,如果我們有一個從 SQL 命令里生成的查詢結(jié)果

SELECT 1 AS FOO,2 AS "BAR";

那么我們會有下面的結(jié)果:

PQfname(res,0)          foo
PQfname(res,1)          BAR
PQfnumber(res,"FOO")    0
PQfnumber(res,"foo")    0
PQfnumber(res,"BAR")    -1
PQfnumber(res,"\"BAR\"")1

PQftable

返回我們抓取的字段所在的表的 OID。字段編號從 0 開始。

Oid PQftable(const PGresult *res,
             int column_number);

如果字段編號超出了范圍,或者聲明的字段不是一個指向某個表的字段的簡單引用, 或者使用了 3.0 版本之前的協(xié)議,那么就會返回InvalidOid。 你可以查詢系統(tǒng)表pg_class來判斷究竟引用了哪個表。

在你包含libpq頭文件的時候, 就會定義類型Oid和常量InvalidOid。 他們都是相同的整數(shù)類型。

PQftablecol

返回組成聲明的查詢結(jié)果字段的字段號(在它的表內(nèi)部)。查詢結(jié)果字段編號從 0 開始,但是表字段編號不會是 0。

int PQftablecol(const PGresult *res,
                int column_number);

如果字段編號超出范圍,或者聲明的字段并不是一個表字段的簡單引用,或者使用的是 3.0 之前的協(xié)議,那么返回零。

PQfformat

返回說明給出字段的格式的格式代碼。字段編號從 0 開始。

int PQfformat(const PGresult *res,
              int column_number);

格式碼為 0 表示文本數(shù)據(jù),而格式碼是一表示二進(jìn)制數(shù)據(jù)。 (其它編碼保留給將來定義。)

PQftype

返回與給定數(shù)據(jù)域編號關(guān)聯(lián)的數(shù)據(jù)域類型。 返回的整數(shù)是一個該類型的內(nèi)部 OID 號。數(shù)據(jù)域編號從0 開始。

Oid PQftype(const PGresult *res,
            int column_number);

你可以查詢系統(tǒng)表pg_type以獲取各種數(shù)據(jù)類型的名稱和屬性。 內(nèi)建的數(shù)據(jù)類型的 OID 在源碼樹的src/include/catalog/pg_type.h文件里定義。

PQfmod

返回與給定字段編號相關(guān)聯(lián)的類型修飾詞。 字段編號從 0 開始。

int PQfmod(const PGresult *res,
           int column_number);

類型修飾符的值是類型相關(guān)的;他們通常包括精度或者尺寸限制。數(shù)值 -1 用 于表示"沒有可用信息"。大多數(shù)數(shù)據(jù)類型不用修飾詞,這種情況下該值總是 -1。

PQfsize

返回與給定字段編號關(guān)聯(lián)的字段以字節(jié)計的大小。 字段編號從0 開始。

int PQfsize(const PGresult *res,
            int column_number);

PQfsize返回在數(shù)據(jù)庫行里面給該數(shù)據(jù)字段分配的空間,換句話說就是該數(shù)據(jù)類型在 服務(wù)器里的二進(jìn)制形式的大小(尺寸)。(因此,這個對客戶端沒有什么用。) 如果該數(shù)據(jù)域是可變尺寸,返回 -1。

PQbinaryTuples

如果PGresult包含二進(jìn)制元組數(shù)據(jù)時返回 1, 如果包含 ASCII 數(shù)據(jù)返回 0。

int PQbinaryTuples(const PGresult *res);

這個函數(shù)已經(jīng)廢棄了(除了還用于與COPY連接之外),因為我們可能在 一個PGresult的某些字段里包含文本數(shù)據(jù),而另外一些字段包含二進(jìn)制數(shù)據(jù) 。更好的是使用PQfformatPQbinaryTuples只有在結(jié)果中的所有字段 都是二進(jìn)制(格式 1)的時候才返回 1。

PQgetvalue

返回一個PGresult里面一行的單獨的一個字段的值。行和字段編號從 0 開始。 調(diào)用者不應(yīng)該直接釋放結(jié)果。在把PGresult句柄傳遞給PQclear之后, 結(jié)果會被自動釋放。

char *PQgetvalue(const PGresult *res,
                 int row_number,
                 int column_number);

對于文本格式的數(shù)據(jù),PQgetvalue返回的值是一個表示字段值的空(NULL) 結(jié)尾的字符串。對于二進(jìn)制格式,返回的值就是由該數(shù)據(jù)類型的typsendtypreceive決定的二進(jìn)制表現(xiàn)形式。(在這種情況下,數(shù)值實際上也跟著一個字節(jié)零, 但是通常這個字節(jié)沒什么用處,因為數(shù)值本身很可能包含內(nèi)嵌的空。)

如果字段值是空,則返回一個空字串。參閱PQgetisnull來區(qū)別空值和空字串值。

PQgetvalue返回的指針指向一個本身是PGresult結(jié)構(gòu)的一部分的存儲區(qū)域。我們不能更改它, 并且如果我們要在PGresult結(jié)構(gòu)的生存期后還要使用它的話, 我們必須明確地把該數(shù)值拷貝到其他存儲器中。

PQgetisnull

測試一個字段是否為空(NULL)。行和字段編號從 0 開始。

int PQgetisnull(const PGresult *res,
                int row_number,
                int column_number);

如果該域包含 NULL,函數(shù)返回 1,如果包含非空(non-null )值,返回 0。 (注意,對一個 NULL 數(shù)據(jù)域,PQgetvalue將返回一個空字符串,不是一個空指針。)

PQgetlength

返回以字節(jié)計的字段的長度。行和字段編號從 0 開始。

int PQgetlength(const PGresult *res,
                int row_number,
                int column_number);

這是某一特定數(shù)據(jù)值的實際數(shù)據(jù)長度。行和字段編號從 0 開始。 這是特定數(shù)值的實際數(shù)據(jù)長度,也就是說,PQgetvalue指向的對象的大小。 對于文本數(shù)據(jù)格式,它和strlen()相同。對于二進(jìn)制格式,這是潛在的信息。 請注意我們不應(yīng)該依靠PQfsize獲取實際數(shù)據(jù)長度。

PQnparams

返回一份聲明中的參數(shù)的數(shù)目。

int PQnparams(const PGresult *res);

檢查的結(jié)果時,這個功能是非常有用的 PQdescribePrepared。對于其他類型的查詢 將返回零。

PQparamtype

返回指示語句中的參數(shù)的數(shù)據(jù)類型。 參數(shù)編號從0開始。

Oid PQparamtype(const PGresult *res,int param_number);

檢查的結(jié)果時,這個功能是非常有用的 PQdescribePrepared。對于其他類型的查詢 將返回零。

PQprint

向指定的輸出流打印所有的行和(可選的)字段名稱。

void PQprint(FILE *fout,/* output stream */
             const PGresult *res,
             const PQprintOpt *po);
typedef struct
{
    pqbool  header;      /* 打印輸出域頭和行計數(shù)*/
    pqbool  align;       /*填充對齊各字段*/
    pqbool  standard;    /* 舊的傻格式  */
    pqbool  html3;       /* 輸出 HTML 表 */
    pqbool  expanded;    /* 擴(kuò)展表*/
    pqbool  pager;       /* 必要時在輸出中使用分頁器 */
    char    *fieldSep;   /* 字段分隔符*/
    char    *tableOpt;   /* 在 HTML 中插入 table ... */
    char    *caption;    /* HTML caption */
    char    **fieldName; /* 替換字段名組成的空零結(jié)尾的數(shù)組*/
} PQprintOpt;

這個函數(shù)以前被psql用于打印查詢結(jié)果,但是現(xiàn)在已經(jīng)不用這個函數(shù)了。請注意它假設(shè)所有的數(shù)據(jù)都是文本格式。

31.3.3. 檢索其它命令的結(jié)果信息

這些函數(shù)用于從PGresult對象里檢索那些非 SELECT 結(jié)果的信息。

PQcmdStatus

返回產(chǎn)生PGresult的 SQL 命令的命令狀態(tài)字符串。

char *PQcmdStatus(PGresult *res);

通常這只是命令的名字,但是它可能包括額外的數(shù)據(jù),比如處理過的行數(shù)。調(diào)用者不應(yīng)該釋放 結(jié)果。結(jié)果會在把PGresult句柄傳遞給PQclear的時候釋放。

PQcmdTuples

返回被 SQL 命令影響的行的數(shù)量。

char *PQcmdTuples(PGresult *res);

這個函數(shù)返回一個生成這個PGresult的這個SQL語句影響的行數(shù)的字串。 這個函數(shù)只能用于SELECTCREATE TABLE ASINSERT,UPDATEDELETE, MOVEFETCH,或者COPY或者COPYEXECUTE語句執(zhí)行之后的結(jié)果。 或者是一個包含INSERTUPDATEDELETE或者DELETE語句EXECUTE的一個準(zhǔn)備好的查詢。 如果生成這個PGresult的命令是其他的東西,那么 PQcmdTuples 返回一個空字串。 調(diào)用者不應(yīng)該直接釋放返回的數(shù)值。在相關(guān)聯(lián)的PGresult被傳遞給PQclear之后, 它會被自動釋放。

PQoidValue

返回一個插入的行的對象標(biāo)識()—— 如果SQL命令是INSERT, 或者是一個包含合適INSERT語句的準(zhǔn)備好的EXECUTE的時候。否則, 函數(shù)返回InvalidOid。如果受INSERT影響的表不包含 OID, 也返回InvalidOid。

Oid PQoidValue(const PGresult *res);

PQoidStatus

如果SQL命令是INSERT,或者包含合適INSERT的準(zhǔn)備好語句EXECUTE了。 返回一個被插入的行的 OID 的字串。(如果INSERT并非恰好插入一行, 或者目標(biāo)表沒有OID,那么字串將是0。) 如果命令不是INSERT,則返回一個空字串。

char *PQoidStatus(const PGresult *res);

這個函數(shù)已經(jīng)廢棄了,因為有了PQoidValue,而且它也不是線程安全的。

31.3.4. 逃逸包含在 SQL 命令中的字串

PQescapeLiteral

char *PQescapeLiteral(PGconn *conn,const char *str,size_t length);

PQescapeLiteral為在 SQL 命令中使用字串而對之進(jìn)行逃逸處理。在我們向 SQL 命令里把數(shù)據(jù)值當(dāng)作文本常量插入的時候很有用。有些字符(比如單引號和反斜杠) 必須被逃逸,以避免他們被 SQL 分析器作為特殊字符解析。 PQescapeLiteral執(zhí)行這個操作。

PQescapeLiteral返回一個內(nèi)存中分配有malloc()str參數(shù) 的逃逸版本。當(dāng)結(jié)果不在需要時,需要通過PQfreemem()來釋放這塊內(nèi)存。 不需要一個0字節(jié)結(jié)束,并且不應(yīng)以length排序。 (如果在處理length字節(jié)之前出現(xiàn)0字節(jié)的結(jié)束,PQescapeLiteral在此處結(jié)束; 不同于strncpy)。返回的字符串包含所有更換的聲明的字符,因此 可以很好的被PostgreSQL字符串文本解析器處理,同樣,允許增加一個0字節(jié)結(jié)尾。 必須在PostgreSQL字符串文本兩邊的單引號包含在結(jié)果字符串中。

一旦錯誤,PQescapeLiteral返回NULL和在CONN對象存儲合適的信息。

Tip: 處理從不可信來源收到的字符串是必須進(jìn)行合適的逃逸,否則存在一定的安全風(fēng)險: 容易受到"SQL injection"攻擊,數(shù)據(jù)庫中會被寫入未知的SQL命令。

需要注意的是,當(dāng)一個數(shù)據(jù)以PQexecParams或它的兄弟格式,作為一個單獨的參數(shù)傳遞時, 做逃逸是不必要,也是不正確的。

PQescapeIdentifier

char *PQescapeIdentifier(PGconn *conn,const char *str,size_t length);

PQescapeIdentifier逃逸一個字符串作為一個SQL標(biāo)識符使用,如 一個表,列,或函數(shù)名。當(dāng)一個用戶自定義標(biāo)識符需要包含特殊的字符,否則將不能被SQL解析器解析為標(biāo)識符的一部分時, 或者當(dāng)標(biāo)識符需要包含大寫字母,且這種情況必須保留時,這樣做是很有用的。

PQescapeIdentifier返回str參數(shù)逃逸為一個內(nèi)存中分配有malloc()的SQL標(biāo)識符 的版本。當(dāng)結(jié)果不再需要時,這塊內(nèi)存必須使用PQfreemem()來釋放。 不需要一個0字節(jié)結(jié)束,并且不應(yīng)以length排序。 (如果在處理length字節(jié)之前出現(xiàn)0字節(jié)的結(jié)束,PQescapeLiteral在此處結(jié)束; 不同于strncpy)。返回的字符串包含所有更換的聲明的字符,因此 可以很好的被PostgreSQL字符串文本解析器處理,同樣,允許增加一個0字節(jié)結(jié)尾。 返回結(jié)果也是被雙引號環(huán)繞。

出錯時,PQescapeIdentifier返回NULL,并且在conn對象中存貯合適的信息。

Tip: 由于帶有字符串常量,為阻止SQL攻擊,當(dāng)從一個不可信任資源獲得時,SQL標(biāo)識符必須逃逸。

PQescapeStringConn

size_t PQescapeStringConn(PGconn *conn,
                          char *to,const char *from,size_t length,
                          int *error);

PQescapeStringConn逃逸字符串常量,必須同于PQescapeLiteral。 不同于PQescapeLiteral,請求應(yīng)該提供一個適當(dāng)大小的緩沖區(qū)。 更重要的是,PQescapeStringConn不會生成一個必須在PostgreSQL字符串 常量兩端的單引號;SQL命令中應(yīng)該提供,這樣結(jié)果中會被插入。 from參數(shù)指向字符串的第一個字符(用以逃逸), length參數(shù)指出了在這個字符串中的字節(jié)數(shù)。 不需要一個0字節(jié)結(jié)束,并且不應(yīng)以length排序。 (如果在處理length字節(jié)之前出現(xiàn)0字節(jié)的結(jié)束,PQescapeLiteral在此處結(jié)束; 不同于strncpy)。to應(yīng)該指向一個包含至少多余兩倍length大小的 緩沖區(qū),要么就不會定義該行為。如果tofrom字符串交疊,那么 也不會定義該行為。

error參數(shù)非NULL,那么在成功的時候*error會被設(shè)置為空, 失敗的時候設(shè)置為非0。目前唯一可能的錯誤條件涉及在源字符串中無效的多字節(jié)編碼。 輸出字符串同樣產(chǎn)生錯誤,但服務(wù)器可以視其為異常以拒絕。一旦發(fā)生錯誤,一條合適的信息會存儲在conn對象中, 無論error是否為NULL。

PQescapeStringConn返回寫到to的字節(jié)數(shù),不包含0字節(jié)終止。

PQescapeString

PQescapeString是一個老的,已經(jīng)被PQescapeStringConn棄用了的版本。

size_t PQescapeString (char *to,const char *from,size_t length);

PQescapeStringConn唯一的不同是,PQescapeString不適用PGconnerror參數(shù)。 因此,不能夠根據(jù)連接屬性(如字符編碼)來調(diào)整其行為,因此可能會給出錯誤的結(jié)果,同樣, 不會報告錯誤條件。

PQescapeString可以在客戶端編程(一次只有一個PostgreSQL連接)中安全的使用。 在這種情況下,它可以找到"在屏幕背后"想要知道的。 在其他情況下,這是一個安全隱患,在使用PQescapeStringConn應(yīng)該避免。

PQescapeByteaConn

逃逸那些在 SQL 命令中使用的用bytea表示的二進(jìn)制數(shù)據(jù)。和PQescapeStringConn一樣, 這個函數(shù)只有在直接向 SQL 字串插入數(shù)據(jù)的時候使用。

unsigned char *PQescapeByteaConn(PGconn *conn,
                                 const unsigned char *from,
                                 size_t from_length,
                                 size_t *to_length);

SQL語句中用做bytea字串文本的一部分的時候,有些字節(jié)值必需逃逸(但是對于所有字節(jié)而言是可以逃逸), PQescapeByteaConn執(zhí)行這個操作,它只逃逸需要逃逸的最少的字符。參閱Section 8.4獲取更多信息。

from參數(shù)指向需要逃逸的字串的第一個字節(jié),from_length參數(shù)反映在這個二進(jìn)制字串( 結(jié)尾的字節(jié)零既不必要也不計算在內(nèi)的字串)里字節(jié)的個數(shù)。to_length參數(shù)應(yīng)該是一個指向某個緩沖區(qū)的指針, 它的空間應(yīng)該能夠保存逃逸后的結(jié)果字串長度。結(jié)果字串長度不包括結(jié)果結(jié)尾的字節(jié)零。

PQescapeByteaConn在內(nèi)存重返回一個from參數(shù)的二進(jìn)制字串的逃逸后的版本, 這片內(nèi)存是用malloc()分配的(如果無法分配內(nèi)存,則返回空指針)。在不再需要結(jié)果的時候, 必須用PQfreemem()釋放它。返回的字串已經(jīng)把所有特殊的字符替換掉了, 這樣他們就可以由PostgreSQL的字串文本分析器以及bytea的輸入函數(shù)正確地處理。 同時還追加了一個結(jié)尾的字節(jié)零。那些必需包圍在PostgreSQL字串文本周圍的單引號并非結(jié)果字串的一部分。

當(dāng)出錯時,返回一個空指針,一個合適的錯誤信息會被儲存在conn對象中,事實上唯一可能的錯誤是結(jié)果字符串的內(nèi)存不足。

PQescapeBytea

PQescapeByteaPQescapeByteaConn的一個舊的,過時的版本。

unsigned char *PQescapeBytea(const unsigned char *from,
                             size_t from_length,
                             size_t *to_length);

PQescapeByteaConn唯一的不同之處在于,PQescapeBytea不使用PGconn參數(shù), 因此,PQescapeBytea可以在客戶端編程(一次只有一個PostgreSQL連接)中安全的使用。 在這種情況下,它可以找到"在屏幕背后"想要知道的。 如果在編程中使用多個數(shù)據(jù)庫連接(在這種情況下使用PQescapeByteaConn),那么可能會給出錯誤結(jié)果。

PQunescapeBytea

把一個二進(jìn)制數(shù)據(jù)的逃逸后的字串表現(xiàn)形式轉(zhuǎn)換成二進(jìn)制數(shù)據(jù) —PQescapeBytea的反作用。 在以文本格式抽取bytea數(shù)據(jù)的時候是必須的, 但是在以二進(jìn)制格式抽取的時候是不必要的。

unsigned char *PQunescapeBytea(const unsigned char *from,size_t *to_length);

from參數(shù)指向一個逃逸后的字串,比如PQgetvalue處理過一個bytea字段后返回的。 PQunescapeBytea把它的字串表現(xiàn)形式轉(zhuǎn)換成二進(jìn)制形式, 它返回一個用malloc()分配的指向該緩沖區(qū)的指針,或者是出錯時返回空, 緩沖區(qū)的尺寸放在to_length里。在不再需要這個結(jié)果之后,這片內(nèi)存必須用PQfreemem釋放。

這種PQescapeBytea轉(zhuǎn)換實際上是不可逆的, 因為,當(dāng)從PQgetvalue接收時,字符串不被希望逃逸。 尤其是,這意味著,不需要考慮字符串引用,并且不需要PGconn參數(shù)。

上一篇: 下一篇: