跳到主要内容

附录E 错误代码

Halo 数据库服务器产生的所有消息都带有一个 5 字符错误码,遵循 SQL 标准的 "SQLSTATE" 约定。需要判断发生了何种错误的应用程序,通常应检测错误码,而不是查看文本错误消息——错误码在不同版本间更稳定,也不会因错误消息的本地化而改变。注意,Halo 产生的错误码中,一部分由 SQL 标准定义,另一部分是针对标准未定义的情形自行扩展或借鉴而来的。

按照标准,错误码的前两位表示一个错误类,后三位表示该类下的一个具体条件。因此,即使应用程序不认识某个具体错误码,也仍能从错误类推断出该如何处理。

表 E.1 列出了 Halo 1.0.16 定义的全部错误码(其中部分目前并未实际使用,而是由 SQL 标准所定义),同时列出了各个错误类。每个错误类都有一个后三位为 000 的"标准"错误码,该码仅用于落在该类内、但未分配更具体错误码的错误条件。

"条件名"一列所示的符号,是在 PL/pgSQL、PL/oraSQL 中使用的条件名。条件名既可大写也可小写。(注意:PL/pgSQL、PL/oraSQL 不识别警告类(区别于错误类)的条件名,即类 00、01、02。)

对于某些类型的错误,服务器会在消息中报告与该错误相关联的数据库对象名称(表、表列、数据类型或约束),例如导致 unique_violation 错误的唯一约束名。这些名称作为错误报告消息的独立字段提供,应用程序无需从可能已本地化的人类可读文本中去解析它们。

错误码在错误消息中的显示形如:

错误: 22012: 除以零

其中 22012 即为 SQLSTATE。

错误码速查(按错误类组织)​

共收录 267 个错误码,按 SQL 标准错误类(Class)组织。标注 ¹ 者为 Halo 私有扩展错误码(见 E.2)。

Class 00 — Successful Completion

错误码类型条件名(Condition Name)
00000成功successful_completion

Class 01 — Warning

错误码类型条件名(Condition Name)
01000警告warning
01003警告null_value_eliminated_in_set_function
01004警告string_data_right_truncation
01006警告privilege_not_revoked
01007警告privilege_not_granted
01008警告implicit_zero_bit_padding
0100C警告dynamic_result_sets_returned
01P01警告deprecated_feature

Class 02 — No Data (this is also a warning class per the SQL standard)

错误码类型条件名(Condition Name)
02000警告no_data
02001警告no_additional_dynamic_result_sets_returned

Class 03 — SQL Statement Not Yet Complete

错误码类型条件名(Condition Name)
03000错误sql_statement_not_yet_complete

Class 08 — Connection Exception

错误码类型条件名(Condition Name)
08000错误connection_exception
08001错误sqlclient_unable_to_establish_sqlconnection
08003错误connection_does_not_exist
08004错误sqlserver_rejected_establishment_of_sqlconnection
08006错误connection_failure
08007错误transaction_resolution_unknown
08P01错误protocol_violation

Class 09 — Triggered Action Exception

错误码类型条件名(Condition Name)
09000错误triggered_action_exception

Class 0A — Feature Not Supported

错误码类型条件名(Condition Name)
0A000错误feature_not_supported

Class 0B — Invalid Transaction Initiation

错误码类型条件名(Condition Name)
0B000错误invalid_transaction_initiation

Class 0F — Locator Exception

错误码类型条件名(Condition Name)
0F000错误locator_exception
0F001错误invalid_locator_specification

Class 0L — Invalid Grantor

错误码类型条件名(Condition Name)
0L000错误invalid_grantor
0LP01错误invalid_grant_operation

Class 0P — Invalid Role Specification

错误码类型条件名(Condition Name)
0P000错误invalid_role_specification

Class 0Z — Diagnostics Exception

错误码类型条件名(Condition Name)
0Z000错误diagnostics_exception
0Z002错误stacked_diagnostics_accessed_without_active_handler

Class 20 — Case Not Found

错误码类型条件名(Condition Name)
20000错误case_not_found

Class 21 — Cardinality Violation

错误码类型条件名(Condition Name)
21000错误cardinality_violation

Class 22 — Data Exception

错误码类型条件名(Condition Name)
22000错误data_exception
22001错误string_data_right_truncation
22002错误null_value_no_indicator_parameter
22003错误numeric_value_out_of_range
22004错误null_value_not_allowed
22005错误error_in_assignment
22007错误invalid_datetime_format
22008错误datetime_field_overflow
22008错误datetime_value_out_of_range
22009错误invalid_time_zone_displacement_value
2200B错误escape_character_conflict
2200C错误invalid_use_of_escape_character
2200D错误invalid_escape_octet
2200F错误zero_length_character_string
2200G错误most_specific_type_mismatch
2200H错误sequence_generator_limit_exceeded
2200L错误not_an_xml_document
2200M错误invalid_xml_document
2200N错误invalid_xml_content
2200S错误invalid_xml_comment
2200T错误invalid_xml_processing_instruction
22010错误invalid_indicator_parameter_value
22011错误substring_error
22012错误division_by_zero
22013错误invalid_preceding_or_following_size
22014错误invalid_argument_for_ntile_function
22015错误interval_field_overflow
22016错误invalid_argument_for_nth_value_function
22018错误invalid_character_value_for_cast
22019错误invalid_escape_character
2201B错误invalid_regular_expression
2201E错误invalid_argument_for_logarithm
2201F错误invalid_argument_for_power_function
2201G错误invalid_argument_for_width_bucket_function
2201W错误invalid_row_count_in_limit_clause
2201X错误invalid_row_count_in_result_offset_clause
22021错误character_not_in_repertoire
22022错误indicator_overflow
22023错误invalid_parameter_value
22024错误unterminated_c_string
22025错误invalid_escape_sequence
22026错误string_data_length_mismatch
22027错误trim_error
2202E错误array_element_error
2202E错误array_subscript_error
2202G错误invalid_tablesample_repeat
2202H错误invalid_tablesample_argument
22030错误duplicate_json_object_key_value
22031错误invalid_argument_for_sql_json_datetime_function
22032错误invalid_json_text
22033错误invalid_sql_json_subscript
22034错误more_than_one_sql_json_item
22035错误no_sql_json_item
22036错误non_numeric_sql_json_item
22037错误non_unique_keys_in_a_json_object
22038错误singleton_sql_json_item_required
22039错误sql_json_array_not_found
2203A错误sql_json_member_not_found
2203B错误sql_json_number_not_found
2203C错误sql_json_object_not_found
2203D错误too_many_json_array_elements
2203E错误too_many_json_object_members
2203F错误sql_json_scalar_required
2203G错误sql_json_item_cannot_be_cast_to_target_type
22P01错误floating_point_exception
22P02错误invalid_text_representation
22P03错误invalid_binary_representation
22P04错误bad_copy_file_format
22P05错误untranslatable_character
22P06错误nonstandard_use_of_escape_character
UEFFF ¹错误ora_exception_error

Class 23 — Integrity Constraint Violation

错误码类型条件名(Condition Name)
23000错误integrity_constraint_violation
23001错误restrict_violation
23502错误not_null_violation
23503错误foreign_key_violation
23505错误unique_violation
23514错误check_violation
23P01错误exclusion_violation

Class 24 — Invalid Cursor State

错误码类型条件名(Condition Name)
24000错误invalid_cursor_state

Class 25 — Invalid Transaction State

错误码类型条件名(Condition Name)
25000错误invalid_transaction_state
25001错误active_sql_transaction
25002错误branch_transaction_already_active
25003错误inappropriate_access_mode_for_branch_transaction
25004错误inappropriate_isolation_level_for_branch_transaction
25005错误no_active_sql_transaction_for_branch_transaction
25006错误read_only_sql_transaction
25007错误schema_and_data_statement_mixing_not_supported
25008错误held_cursor_requires_same_isolation_level
25P01错误no_active_sql_transaction
25P02错误in_failed_sql_transaction
25P03错误idle_in_transaction_session_timeout

Class 26 — Invalid SQL Statement Name

错误码类型条件名(Condition Name)
26000错误invalid_sql_statement_name

Class 27 — Triggered Data Change Violation

错误码类型条件名(Condition Name)
27000错误triggered_data_change_violation

Class 28 — Invalid Authorization Specification

错误码类型条件名(Condition Name)
28000错误invalid_authorization_specification
28P01错误invalid_password

Class 2B — Dependent Privilege Descriptors Still Exist

错误码类型条件名(Condition Name)
2B000错误dependent_privilege_descriptors_still_exist
2BP01错误dependent_objects_still_exist

Class 2D — Invalid Transaction Termination

错误码类型条件名(Condition Name)
2D000错误invalid_transaction_termination

Class 2F — SQL Routine Exception

错误码类型条件名(Condition Name)
2F000错误sql_routine_exception
2F002错误modifying_sql_data_not_permitted
2F003错误prohibited_sql_statement_attempted
2F004错误reading_sql_data_not_permitted
2F005错误function_executed_no_return_statement

Class 34 — Invalid Cursor Name

错误码类型条件名(Condition Name)
34000错误invalid_cursor_name

Class 38 — External Routine Exception

错误码类型条件名(Condition Name)
38000错误external_routine_exception
38001错误containing_sql_not_permitted
38002错误modifying_sql_data_not_permitted
38003错误prohibited_sql_statement_attempted
38004错误reading_sql_data_not_permitted

Class 39 — External Routine Invocation Exception

错误码类型条件名(Condition Name)
39000错误external_routine_invocation_exception
39001错误invalid_sqlstate_returned
39004错误null_value_not_allowed
39P01错误trigger_protocol_violated
39P02错误srf_protocol_violated
39P03错误event_trigger_protocol_violated

Class 3B — Savepoint Exception

错误码类型条件名(Condition Name)
3B000错误savepoint_exception
3B001错误invalid_savepoint_specification

Class 3D — Invalid Catalog Name

错误码类型条件名(Condition Name)
3D000错误invalid_catalog_name

Class 3F — Invalid Schema Name

错误码类型条件名(Condition Name)
3F000错误invalid_schema_name

Class 40 — Transaction Rollback

错误码类型条件名(Condition Name)
40000错误transaction_rollback
40001错误serialization_failure
40002错误transaction_integrity_constraint_violation
40003错误statement_completion_unknown
40P01错误deadlock_detected

Class 42 — Syntax Error or Access Rule Violation

错误码类型条件名(Condition Name)
26000错误undefined_pstatement
34000错误undefined_cursor
3D000错误undefined_database
3F000错误undefined_schema
42000错误syntax_error_or_access_rule_violation
42501错误insufficient_privilege
42601错误syntax_error
42602错误invalid_name
42611错误invalid_column_definition
42622错误name_too_long
42701错误duplicate_column
42702错误ambiguous_column
42703错误undefined_column
42704错误undefined_object
42710错误duplicate_object
42712错误duplicate_alias
42723错误duplicate_function
42725错误ambiguous_function
42803错误grouping_error
42804错误datatype_mismatch
42809错误wrong_object_type
42830错误invalid_foreign_key
42846错误cannot_coerce
42883错误undefined_function
428C9错误generated_always
42939错误reserved_name
42P01错误undefined_table
42P02错误undefined_parameter
42P03错误duplicate_cursor
42P04错误duplicate_database
42P05错误duplicate_prepared_statement
42P06错误duplicate_schema
42P07错误duplicate_table
42P08错误ambiguous_parameter
42P09错误ambiguous_alias
42P10错误invalid_column_reference
42P11错误invalid_cursor_definition
42P12错误invalid_database_definition
42P13错误invalid_function_definition
42P14错误invalid_prepared_statement_definition
42P15错误invalid_schema_definition
42P16错误invalid_table_definition
42P17错误invalid_object_definition
42P18错误indeterminate_datatype
42P19错误invalid_recursion
42P20错误windowing_error
42P21错误collation_mismatch
42P22错误indeterminate_collation

Class 44 — WITH CHECK OPTION Violation

错误码类型条件名(Condition Name)
44000错误with_check_option_violation

Class 53 — Insufficient Resources

错误码类型条件名(Condition Name)
53000错误insufficient_resources
53100错误disk_full
53200错误out_of_memory
53300错误too_many_connections
53400错误configuration_limit_exceeded

Class 54 — Program Limit Exceeded

错误码类型条件名(Condition Name)
54000错误program_limit_exceeded
54001错误statement_too_complex
54011错误too_many_columns
54023错误too_many_arguments

Class 55 — Object Not In Prerequisite State

错误码类型条件名(Condition Name)
55000错误object_not_in_prerequisite_state
55006错误object_in_use
55P02错误cant_change_runtime_param
55P03错误lock_not_available
55P04错误unsafe_new_enum_value_usage

Class 57 — Operator Intervention

错误码类型条件名(Condition Name)
57000错误operator_intervention
57014错误query_canceled
57P01错误admin_shutdown
57P02错误crash_shutdown
57P03错误cannot_connect_now
57P04错误database_dropped
57P05错误idle_session_timeout

Class 58 — System Error (errors external to Halo itself)

错误码类型条件名(Condition Name)
58000错误system_error
58030错误io_error
58P01错误undefined_file
58P02错误duplicate_file

Class 72 — Snapshot Failure

错误码类型条件名(Condition Name)
72000错误snapshot_too_old

Class F0 — Configuration File Error

错误码类型条件名(Condition Name)
F0000错误config_file_error
F0001错误lock_file_exists

Class HV — Foreign Data Wrapper Error (SQL/MED)

错误码类型条件名(Condition Name)
HV000错误fdw_error
HV001错误fdw_out_of_memory
HV002错误fdw_dynamic_parameter_value_needed
HV004错误fdw_invalid_data_type
HV005错误fdw_column_name_not_found
HV006错误fdw_invalid_data_type_descriptors
HV007错误fdw_invalid_column_name
HV008错误fdw_invalid_column_number
HV009错误fdw_invalid_use_of_null_pointer
HV00A错误fdw_invalid_string_format
HV00B错误fdw_invalid_handle
HV00C错误fdw_invalid_option_index
HV00D错误fdw_invalid_option_name
HV00J错误fdw_option_name_not_found
HV00K错误fdw_reply_handle
HV00L错误fdw_unable_to_create_execution
HV00M错误fdw_unable_to_create_reply
HV00N错误fdw_unable_to_establish_connection
HV00P错误fdw_no_schemas
HV00Q错误fdw_schema_not_found
HV00R错误fdw_table_not_found
HV010错误fdw_function_sequence_error
HV014错误fdw_too_many_handles
HV021错误fdw_inconsistent_descriptor_information
HV024错误fdw_invalid_attribute_value
HV090错误fdw_invalid_string_length_or_buffer_length
HV091错误fdw_invalid_descriptor_field_identifier

Class P0 — PL/pgSQL Error

错误码类型条件名(Condition Name)
P0000错误plpgsql_error
P0001错误raise_exception
P0002错误no_data_found
P0003错误too_many_rows
P0004错误assert_failure

Class XX — Internal Error

错误码类型条件名(Condition Name)
XX000错误internal_error
XX001错误data_corrupted
XX002错误index_corrupted

Halo 私有扩展错误码​

除 SQL 标准定义的错误码外,Halo 针对 Oracle 兼容模式新增了以下私有错误码,类码 UE 为 Halo 扩展类,不属于 SQL 标准:

错误码类型条件名说明
UEFFF ¹错误ora_exception_errorOracle 兼容模式下,PL/oraSQL 中抛出的未映射异常(undefined exception)。

触发示例(Oracle 兼容模式,端口 1521)

在 PL/oraSQL 块中使用 RAISE 抛出该条件名:

halo0root@oracle=# DO $$
BEGIN
RAISE ora_exception_error USING MESSAGE = 'test undefined halo exception';
END $$;
错误: UEFFF: test undefined halo exception
背景: 在RAISE的第3行的PL/oraSQL函数inline_code_block
位置: exec_stmt_raise, plora_exec.c:5457

Oracle 风格的 RAISE_APPLICATION_ERROR(-20001, msg) 走的是 Halo 另一套错误码体系(如 HERR-20001),与 SQLSTATE 的 UEFFF 不同。捕获 Oracle 兼容模式的自定义异常时,应注意区分这两种抛出方式。

MySQL 协议端口的错误码差异​

Halo 通过 MySQL 协议端口(默认 3306)对外提供 MySQL 兼容访问。该端口返回的是 MySQL 原生格式的错误码,而非 SQLSTATE 五位码,这是 MySQL 客户端协议的固有行为。

MySQL 错误码格式

MySQL 错误信息形如:

ERROR 1478 (HY000) at line 1: 语法错误 在 "SELCT" 或附近的

其中:

  • 1478:MySQL 数字错误码(4 位数字)。
  • HY000:MySQL 的 SQLSTATE(HY000 表示通用错误,与 SQL 标准的 SQLSTATE 体系不同)。

对照示例

同一"语法错误"场景,原生端口与 MySQL 协议端口返回的错误码格式不同:

端口错误码格式示例
原生端口(1921)/ Oracle 兼容端口(1521)SQLSTATE 五位码42601: syntax error...
MySQL 协议端口(3306)MySQL 数字码 + HY000ERROR 1478 (HY000)

开发建议:通过 MySQL 客户端/驱动(端口 3306)连接 Halo 时,按 MySQL 数字错误码(如 1064 语法错误、1146 表不存在、1050 表已存在)进行错误捕获;通过原生端口或 Oracle 兼容端口连接时,按本附录的 SQLSTATE 进行捕获。两套错误码体系不互通。

关于条件名​

"条件名"一列中,少量错误码(如 22008、34000、3D000、26000、3F000)仅有 SQLSTATE 而无标准条件名,本附录以宏名(errcode macro)的小写形式列出,仅供识别;此类名称不可用于 RAISE 或 EXCEPTION WHEN。其余条件名可用于 PL/pgSQL、PL/oraSQL 中的异常捕获,例如:

EXCEPTION
WHEN division_by_zero THEN ...