【发布时间】:2016-07-18 18:52:04
【问题描述】:
工具:Toad 9.7.2.5
我写了 1 个函数,里面有一个插入语句。
我执行命令
SELECT TWO2F_QUERY_TEST ('XX', 'XX')
FROM DUAL;
当这个函数返回SYS_REFCURSOR时,我会得到
1,N,*插入 TWO2R063_W1 错误(C1-未使用)**ORA-14551:不能 在查询中执行 DML 操作
当这个函数返回varchar2时,会处理成功
代码:
CREATE OR REPLACE FUNCTION TWO2F_QUERY_TEST
(PI_BUS_ID IN VARCHAR2 ,
PI_TMNL_ID IN VARCHAR2
)RETURN SYS_REFCURSOR IS
--)RETURN VARCHAR2 IS
PO_CURSOR SYS_REFCURSOR;
WK_ACTION VARCHAR2(01) := 'Y';
WK_MSG VARCHAR2(100);
BEGIN
BEGIN
INSERT INTO TWO2R063_W1
( R063W1_TITLE ,
R063W1_FORWARD
)
VALUES
( 'PROGRAM NOT USED' ,
'XX'
)
;
EXCEPTION
WHEN OTHERS THEN
WK_ACTION := 'N';
WK_MSG := SUBSTR('*INSERT TWO2R063_W1 ERROR(C1-NOT USED)'||SQLERRM, 1, 100);
GOTO OUTER;
<<OUTER>>
<<ENDRTN>>
OPEN PO_CURSOR FOR
SELECT ROWNUM AS PO_ROWNUM ,
WK_ACTION AS PO_ACTION ,
WK_MSG AS PO_MSG
FROM DUAL
;
RETURN PO_CURSOR;
--RETURN 'Y';
END TWO2F_QUERY_TEST;
/
SHOW ERROR;
DROP PUBLIC SYNONYM TWO2F_QUERY_TEST;
CREATE PUBLIC SYNONYM TWO2F_QUERY_TEST FOR TWO2F_QUERY_TEST;
GRANT EXECUTE ON TWO2F_QUERY_TEST TO GTS_AP_MAINTAIN, EGTS;
/
========================================================
DROP TABLE TWO2.TWO2R063_W1 CASCADE CONSTRAINTS;
CREATE GLOBAL TEMPORARY TABLE TWO2.TWO2R063_W1
(R063W1_TITLE VARCHAR2(50 BYTE),
R063W1_FORWARD VARCHAR2(20 BYTE)
)ON COMMIT PRESERVE ROWS NOCACHE;
DROP PUBLIC SYNONYM TWO2R063_W1;
CREATE PUBLIC SYNONYM TWO2R063_W1 FOR TWO2.TWO2R063_W1;
GRANT DELETE, INSERT, SELECT, UPDATE ON TWO2.TWO2R063_W1 TO TWO2_MAINTAIN;
GRANT SELECT ON TWO2.TWO2R063_W1 TO TWO2_QUERY;
【问题讨论】:
-
在查询中引用函数时,不允许该函数更改数据库状态。因此,如果您的函数执行任何 DML 操作,请不要在查询中使用它。
标签: oracle