为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:DM Database Server x64 V8
【操作系统】:window
【CPU】:6
【问题描述】*:函数运用动态EXECUTE IMMEDIATE,必须用自治事务,用了自治事务,返回结果在插入表中,就会报-3958: 检测到活动的主事务任务,禁止启动自治事务,
不用 PRAGMA AUTONOMOUS_TRANSACTION;
-7145,无法在查询中执行DML操作
CREATE OR REPLACE FUNCTION test()
RETURN BIGINT
AS
DECLARE --PRAGMA AUTONOMOUS_TRANSACTION;
sqlv VARCHAR;taskid BIGINT;
BEGIN
sqlv := '
INSERT INTO pip_prtemp.temp_case_task_modeid(taskid)
SELECT id FROM pip_pr.config LIMIT 1
';
EXECUTE IMMEDIATE sqlv;
COMMIT;
SELECT taskid INTO taskid FROM pip_prtemp.temp_case_task_modeid;
PRINT taskid;
--SELECT id INTO taskid FROM pip_pr.config LIMIT 1;
/* sqlv := '
INSERT INTO prtemp.temp_collect_task_modeid(taskid,auditmodeid)
SELECT 2,2
';
EXECUTE IMMEDIATE sqlv;*/
/* sqlv := '
INSERT INTO prtemp.temp_case_task_modeid(taskid,auditmodeid)
SELECT taskid,auditmodeid FROM prtemp.temp_collect_task_modeid
';
EXECUTE IMMEDIATE sqlv;*/
--COMMIT;
RETURN taskid;
EXCEPTION
WHEN OTHERS THEN
--ROLLBACK;
PRINT '案例筛选条件异常:'||SQLCODE||','||SQLERRM;
END;
select build_version from v$instance;先看看具体数据库版本,可能和版本有关,
这个问题在发布版本V8.1.4.39解决
带有dml的操作,不能在select中执行。是报错 无法在查询中执行DML操作的原因。
直接执行 test(); 即可,不需要带 select。
对于:
-3958: 检测到活动的主事务任务,禁止启动自治事务
这个报错,可能是嵌套自治事务之类的引起的,有具体报错场景么?
可以提供基础表结构等,方便大家一起查看。;)