🐛 fix(oracle): 修复存储过程斜杠分隔执行截断

- 支持 SQL*Plus 斜杠分隔符后的可选分号,避免 Oracle 过程执行出空语句
- 光标落在过程异常尾部或斜杠分隔行时,仍选择完整 PL/SQL 定义执行
- 补充前端语句选择、QueryEditor 执行和后端 split/DBQueryMulti 回归测试
This commit is contained in:
Syngnat
2026-06-25 17:37:32 +08:00
parent f6556f25d5
commit 9ab31a7614
6 changed files with 372 additions and 0 deletions

View File

@@ -343,6 +343,48 @@ END cproc_tzhssr_order2sale_A1;`,
}
}
func TestSplitSQLStatements_OracleCreateProcedureSkipsSemicolonAfterSqlPlusSlashDelimiter(t *testing.T) {
input := `-- 修改函数/存储过程H2.cproc_tzhssr_order2sale_A1
-- 请确认语法兼容当前数据库后执行
CREATE OR REPLACE PROCEDURE cproc_tzhssr_order2sale_A1(
p_sourceid IN VARCHAR2,
p_msg_out OUT NVARCHAR2
) AS
v_ecnt NUMBER;
BEGIN
SELECT COUNT(*) INTO v_ecnt FROM dual;
p_msg_out := '';
EXCEPTION
WHEN OTHERS THEN
p_msg_out := substr('订单核销失败,错误信息:' || SQLERRM || ',错误位置:' ||
dbms_utility.format_error_backtrace, 1, 1000);
END cproc_tzhssr_order2sale_A1;
/;
SELECT 1 FROM dual;`
got := splitSQLStatements(input)
want := []string{
`-- 修改函数/存储过程H2.cproc_tzhssr_order2sale_A1
-- 请确认语法兼容当前数据库后执行
CREATE OR REPLACE PROCEDURE cproc_tzhssr_order2sale_A1(
p_sourceid IN VARCHAR2,
p_msg_out OUT NVARCHAR2
) AS
v_ecnt NUMBER;
BEGIN
SELECT COUNT(*) INTO v_ecnt FROM dual;
p_msg_out := '';
EXCEPTION
WHEN OTHERS THEN
p_msg_out := substr('订单核销失败,错误信息:' || SQLERRM || ',错误位置:' ||
dbms_utility.format_error_backtrace, 1, 1000);
END cproc_tzhssr_order2sale_A1;`,
"SELECT 1 FROM dual",
}
if !reflect.DeepEqual(got, want) {
t.Errorf("splitSQLStatements(%q) = %#v, want %#v", input, got, want)
}
}
func TestSplitSQLStatements_OraclePackageSpecAndBodyStayWhole(t *testing.T) {
input := `CREATE OR REPLACE PACKAGE pkg_order AS
PROCEDURE sync_order(p_id IN NUMBER);