🐛 fix(query-editor): 修复过程脚本斜杠分隔符误执行

- 前端语句选择跳过独立 SQL*Plus 斜杠分隔符

- 后端 SQL 拆分和流式文件执行保持过程体完整

- 增加 Oracle 过程脚本执行回归测试
This commit is contained in:
Syngnat
2026-06-24 21:10:59 +08:00
parent 8a552c4cb3
commit 1a9d417c0a
7 changed files with 314 additions and 0 deletions

View File

@@ -211,6 +211,55 @@ END;`,
}
}
func TestSplitSQLStatements_OracleCreateProcedureSkipsSqlPlusSlashDelimiter(t *testing.T) {
input := `CREATE OR REPLACE PROCEDURE cproc_tzhssr_order2sale_new(
p_sourceid IN VARCHAR2
) IS
v_memcardno VARCHAR2(40);
v_ecnt NUMBER;
CURSOR cur_ware IS
SELECT d.goodsid, d.goodsqty
FROM t_order_d d
WHERE d.sourceid = p_sourceid;
BEGIN
FOR row_ware IN cur_ware LOOP
v_ecnt := row_ware.goodsqty;
END LOOP;
END;
/
SELECT 1 FROM dual;`
got := splitSQLStatements(input)
want := []string{
`CREATE OR REPLACE PROCEDURE cproc_tzhssr_order2sale_new(
p_sourceid IN VARCHAR2
) IS
v_memcardno VARCHAR2(40);
v_ecnt NUMBER;
CURSOR cur_ware IS
SELECT d.goodsid, d.goodsqty
FROM t_order_d d
WHERE d.sourceid = p_sourceid;
BEGIN
FOR row_ware IN cur_ware LOOP
v_ecnt := row_ware.goodsqty;
END LOOP;
END;`,
"SELECT 1 FROM dual",
}
if !reflect.DeepEqual(got, want) {
t.Errorf("splitSQLStatements(%q) = %#v, want %#v", input, got, want)
}
}
func TestSplitSQLStatements_DoesNotTreatSlashOperatorLineAsDelimiter(t *testing.T) {
input := "SELECT 10\n/\n2 FROM dual;"
got := splitSQLStatements(input)
want := []string{"SELECT 10\n/\n2 FROM dual"}
if !reflect.DeepEqual(got, want) {
t.Errorf("splitSQLStatements(%q) = %#v, want %#v", input, got, want)
}
}
func TestSplitSQLStatements_TransactionBeginStillSplits(t *testing.T) {
input := "BEGIN; UPDATE accounts SET balance = balance - 1 WHERE id = 1; COMMIT;"
got := splitSQLStatements(input)