From f51dbcfb2ce1a48be6339299f5b90c987fa6047d Mon Sep 17 00:00:00 2001 From: Syngnat Date: Wed, 29 Apr 2026 09:41:25 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20fix(oracle):=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E6=9F=A5=E8=AF=A2=E7=BB=93=E6=9E=9C=E7=BC=96=E8=BE=91?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=E5=90=8E=E6=95=B0=E6=8D=AE=E8=BF=98=E5=8E=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Oracle GetColumns 未返回主键列标记,前端 pkColumns 为空后退化为 全列 WHERE 条件,Oracle 空字符串即 NULL 语义导致 UPDATE 匹配 0 行。 LEFT JOIN all_constraints + all_cons_columns 检测主键列并赋值 Key="PRI", 与达梦驱动实现方式一致。 --- internal/db/oracle_impl.go | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/internal/db/oracle_impl.go b/internal/db/oracle_impl.go index 9efb1b6..6f8947f 100644 --- a/internal/db/oracle_impl.go +++ b/internal/db/oracle_impl.go @@ -263,16 +263,31 @@ func (o *OracleDB) GetCreateStatement(dbName, tableName string) (string, error) } func (o *OracleDB) GetColumns(dbName, tableName string) ([]connection.ColumnDefinition, error) { - query := fmt.Sprintf(`SELECT column_name, data_type, nullable, data_default - FROM all_tab_columns - WHERE owner = '%s' AND table_name = '%s' - ORDER BY column_id`, strings.ToUpper(dbName), strings.ToUpper(tableName)) + query := fmt.Sprintf(`SELECT c.column_name, c.data_type, c.nullable, c.data_default, + CASE WHEN pk.column_name IS NOT NULL THEN 'PRI' ELSE '' END AS column_key + FROM all_tab_columns c + LEFT JOIN ( + SELECT cols.owner, cols.table_name, cols.column_name + FROM all_constraints cons + JOIN all_cons_columns cols + ON cons.owner = cols.owner AND cons.constraint_name = cols.constraint_name + WHERE cons.constraint_type = 'P' + ) pk ON c.owner = pk.owner AND c.table_name = pk.table_name AND c.column_name = pk.column_name + WHERE c.owner = '%s' AND c.table_name = '%s' + ORDER BY c.column_id`, strings.ToUpper(dbName), strings.ToUpper(tableName)) if dbName == "" { - query = fmt.Sprintf(`SELECT column_name, data_type, nullable, data_default - FROM user_tab_columns - WHERE table_name = '%s' - ORDER BY column_id`, strings.ToUpper(tableName)) + query = fmt.Sprintf(`SELECT c.column_name, c.data_type, c.nullable, c.data_default, + CASE WHEN pk.column_name IS NOT NULL THEN 'PRI' ELSE '' END AS column_key + FROM user_tab_columns c + LEFT JOIN ( + SELECT cols.table_name, cols.column_name + FROM user_constraints cons + JOIN user_cons_columns cols USING (constraint_name) + WHERE cons.constraint_type = 'P' + ) pk ON c.table_name = pk.table_name AND c.column_name = pk.column_name + WHERE c.table_name = '%s' + ORDER BY c.column_id`, strings.ToUpper(tableName)) } data, _, err := o.Query(query) @@ -286,6 +301,7 @@ func (o *OracleDB) GetColumns(dbName, tableName string) ([]connection.ColumnDefi Name: fmt.Sprintf("%v", row["COLUMN_NAME"]), Type: fmt.Sprintf("%v", row["DATA_TYPE"]), Nullable: fmt.Sprintf("%v", row["NULLABLE"]), + Key: fmt.Sprintf("%v", row["COLUMN_KEY"]), } if row["DATA_DEFAULT"] != nil {