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;

解决方案 »

  1.   

    CREATE OR REPLACE FUNCTION 
    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;
      

  2.   

    ls的方法是最简单的一种,不过目测LZ的函数有问题,声明返回integer,实际返回VARCHAR。
      

  3.   

    不能在function中执行insert等DML语句
      

  4.   

    问题应该不是function里不能使用commit;应该是select 子句里的function不能使用commit;
    执行select 操作实际已经开启了隐式的事务,你在中途就提交了,这个sql还要不要执行呢?
      

  5.   

    呵呵  1* create global temporary table t1(单据编号 varchar2(20)) on commit preserve rows
    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语句