【DM版本】:v8
【操作系统】:
【CPU】:
【问题描述】*:
函数如下:
CREATE OR REPLACE FUNCTION "FSP"."WDC"("SEQNAME" IN VARCHAR(32767))
RETURN VARCHAR(32767)
AUTHID DEFINER
AS
seq_rules VARCHAR;
seq_length INT;
seq_max BIGINT;
seq_date_fmt VARCHAR;
max_id_length INT;
max_id VARCHAR;
len INT;
BEGIN
UPDATE seq set max = max + next WHERE name = seqname;
commit;
SELECT
rules ,
length,
max ,
date_fmt
INTO
seq_rules ,
seq_length,
seq_max ,
seq_date_fmt
FROM
seq
WHERE
name = seqname;
SET max_id = seq_max;
SET max_id_length = CHARACTER_LENGTH(max_id);
SET len = seq_length - max_id_length;
--长度不够补0
WHILE len > 0
LOOP
SET max_id = CONCAT(0, max_id);
SET len = len - 1;
END LOOP;
--替换规则
IF seq_rules IS NOT NULL AND INSTR(seq_rules, '###max_id###') > 0 THEN
SET seq_rules = REPLACE(seq_rules, '###max_id###', max_id);
SET max_id = seq_rules;
END IF;
IF seq_rules IS NOT NULL AND INSTR(seq_rules, '###date###') > 0 AND seq_date_fmt IS NOT NULL THEN
SET max_id = REPLACE(seq_rules, '###date###', DATE_FORMAT(NOW(), seq_date_fmt));
END IF;
return max_id;
END;
执行SELECT WDC(‘SH22’),报错:无法在查询中执行DML操作。
函数不能带update语句吗?那该如何修改?
1.存储函数时用来计算和返回结果的,不是用来更改数据库状态的,如果有DML需求应该使用存储过程;
2.可以使用自治事务来解决存储函数中执行dml的问题,方法是在函数声明中增加PRAGMA AUTONOMOUS_TRANSACTION;
#创建序列
CREATE SEQUENCE “SYSDBA”.“SEQTEST”
INCREMENT BY 1
START WITH 1
MAXVALUE 9223372036854775807
MINVALUE 1
NOCYCLE
NOCACHE
NOORDER
;
#使用序列
UPDATE seq set max = max + SEQTEST.NEXTVAL WHERE name = seqname;
#你上面那个直接+next改下试试