鄙人oracle小菜,今天写了个函数,仅有一个insert语句,如下:
CREATE OR REPLACE FUNCTION WZ_CUST_CIQ_INF.F_AUTO_EDI_PROC_LOG(
VS_REC_NAM VARCHAR2,
VS_MODULE VARCHAR2,
VS_ORDER_GUID VARCHAR2,
VS_ORDER_TYP VARCHAR2,
VS_PROC_NAM VARCHAR2,
VS_PROC_RETURN VARCHAR2)
RETURN VARCHAR2 IS
VS_IP_ADDR S_CUST_CIQ_PROC_LOG.IP_ADDR%TYPE;
VS_GUID S_CUST_CIQ_PROC_LOG.GUID%TYPE;
BEGIN
--IP地址
select sys_context('userenv','ip_address') INTO VS_IP_ADDR from dual;
--GUID
SELECT SEQ_PROC_LOG_GUID.NEXTVAL INTO VS_GUID FROM DUAL;
Insert into WZ_CUST_CIQ_INF.S_CUST_CIQ_PROC_LOG
(GUID, REC_TIM, REC_NAM, IP_ADDR, MODULE,
ORDER_GUID, ORDER_TYP, PROC_NAM, PROC_RETURN)
Values(VS_GUID, SYSDATE, VS_REC_NAM, VS_IP_ADDR, VS_MODULE,
VS_ORDER_GUID,VS_ORDER_TYP, VS_PROC_NAM, VS_PROC_RETURN);
COMMIT;
RETURN '99';
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
RETURN SQLERRM;
END;
/
然后我就在过程中
SELECT F_AUTO_EDI_PROC_LOG( VS_OPER_COD, '国检指令自动执行', VS_GUID, '3', 'P_AUTO_EDI_PROCESS', VS_RTN )
INTO VS_LOG_RTN
FROM DUAL;
结果报错:ORA-14551: 无法在查询中执行 DML 操作。
经过一番查询,发现一个常识性错误,我的select算是一个查询语言,而函数体中存在操纵语言,DQL语言中无法执行DML语言,着实菜了一把。
后面把函数改为过程,直接在过程中调用,而不同select,解决了此问题。