create global temporary table t1(单据编号 varchar2(20)) on commit delete rows;CREATE OR REPLACE FUNCTION
get_TEST(v_lc varchar2)
RETURN integer
iS
lc单据编号 VARCHAR(200);
BEGIN
lc单据编号 := v_lc;
INSERT INTO T1 (单据编号) VALUES (lc单据编号);
INSERT INTO T1 (单据编号) VALUES (lc单据编号 || '1');
INSERT INTO T1 (单据编号) VALUES (lc单据编号 || '2');
INSERT INTO T1 (单据编号) VALUES (lc单据编号 || '3');
INSERT INTO T1 (单据编号) VALUES (lc单据编号 || '4');
COMMIT;
return(lc单据编号);
END get_TEST;select get_TEST('a001') FROM dual; 错误 ORA-14551: 无法在查询中执行DML操作
SELECT * from sms.T1;
get_TEST(v_lc varchar2)
RETURN integer
iS
lc单据编号 VARCHAR(200);
BEGIN
lc单据编号 := v_lc;
INSERT INTO T1 (单据编号) VALUES (lc单据编号);
INSERT INTO T1 (单据编号) VALUES (lc单据编号 || '1');
INSERT INTO T1 (单据编号) VALUES (lc单据编号 || '2');
INSERT INTO T1 (单据编号) VALUES (lc单据编号 || '3');
INSERT INTO T1 (单据编号) VALUES (lc单据编号 || '4');
COMMIT;
return(lc单据编号);
END get_TEST;select get_TEST('a001') FROM dual; 错误 ORA-14551: 无法在查询中执行DML操作
SELECT * from sms.T1;
get_TEST(v_lc varchar2)
RETURN integer
iS
PRAGMA AUTONOMOUS_TRANSACTION; --使用自治事务
lc单据编号 VARCHAR(200);
BEGIN
lc单据编号 := v_lc;
INSERT INTO T1 (单据编号) VALUES (lc单据编号);
INSERT INTO T1 (单据编号) VALUES (lc单据编号 || '1');
INSERT INTO T1 (单据编号) VALUES (lc单据编号 || '2');
INSERT INTO T1 (单据编号) VALUES (lc单据编号 || '3');
INSERT INTO T1 (单据编号) VALUES (lc单据编号 || '4');
COMMIT;
return(lc单据编号);
END get_TEST;
执行select 操作实际已经开启了隐式的事务,你在中途就提交了,这个sql还要不要执行呢?
scott@ORCL> /表已创建。
scott@ORCL> ed
已写入 file afiedt.buf 1 CREATE OR REPLACE FUNCTION
2 get_TEST(v_lc varchar2)
3 RETURN varchar2 ---楼主你返回的应该是字符型
4 iS
5 pragma autonomous_transaction;--加自治事务
6 lc单据编号 VARCHAR(200);
7 BEGIN
8 lc单据编号 := v_lc;
9 INSERT INTO T1 (单据编号) VALUES (lc单据编号);
10 INSERT INTO T1 (单据编号) VALUES (lc单据编号 || '1');
11 INSERT INTO T1 (单据编号) VALUES (lc单据编号 || '2');
12 INSERT INTO T1 (单据编号) VALUES (lc单据编号 || '3');
13 INSERT INTO T1 (单据编号) VALUES (lc单据编号 || '4');
14 COMMIT;
15 return(lc单据编号);
16* END get_TEST;
scott@ORCL> /函数已创建。scott@ORCL> select get_TEST('a001') FROM dual
2 /GET_TEST('A001')
-------------------------------------------------------------------------
a001
scott@ORCL> select * from t1
2 /单据编号
--------------------
a001
a0011
a0012
a0013
a0014
a001
a0011
a0012
a0013
a0014已选择10行。
---不过不建议在函数里面DML语句