我有这样的代码 - :
DECLARE
--BEGIN
V_DATE DATE;
FUNCTION GETDATE(NUM_DAYS NUMBER) RETURN DATE IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
INSERT INTO LEAVE.GES_LEV_REQ_PURG_ERR VALUES (NUM_DAYS, NUM_DAYS, SYSDATE);
COMMIT;
RETURN(SYSDATE);
END GETDATE;
BEGIN
--V_DATE := GETDATE(1);
SELECT GETDATE(1) INTO V_DATE FROM DUAL;
DBMS_OUTPUT.PUT_LINE(V_DATE);
END;
/
但这是在抛出错误 -
ORA-06550: line 17, column 10:
PLS-00231: function 'GETDATE' may not be used in SQL
ORA-06550: line 17, column 10:
PL/SQL: ORA-00904: : invalid identifier
ORA-06550: line 17, column 3:
PL/SQL: SQL Statement ignored
如果我在没有选择查询的情况下调用该函数,它可以正常工作。 请帮忙。
答案 0 :(得分:2)
嵌套的子程序可以在创建它的过程的范围内使用。嵌套的子程序不能在SQL中使用,因为它不能直接作为DB对象使用。请注意,有两个引擎正在执行PL / SQL块(SQL引擎和PL / SQL引擎)。在使用嵌套函数执行查询时,SQL引擎会尝试将函数名称与DB对象进行匹配。但在你的情况下,它是一个程序内的子程序。希望我能理解。
正如你所说,你可以在一个函数中执行DML,它可以在SQL中使用,前提是它被声明为PRAGMA AUTONOMOUS_TRANSACTION
答案 1 :(得分:0)
在我们继续之前,基本上有两件事需要提出 任何答案。 1)这种呼叫或阻止的确切用途是什么。 2)为什么你不首先去创建FUCNTION然后再打电话。
注意:[无论如何你不能在SELECT语句中调用FUNCTION 有DML操作涉及它。 ]
我会试着说明它应该有效。如果有,请告诉我 帮助
--Create Function
CREATE OR REPLACE FUNCTION GETDATE(
NUM_DAYS NUMBER)
RETURN DATE
IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
INSERT INTO LEAVE.GES_LEV_REQ_PURG_ERR VALUES
(NUM_DAYS, NUM_DAYS, SYSDATE
);
COMMIT;
RETURN(SYSDATE);
END GETDATE;
-- Call the function but not in a SQL statement.
set serveroutput on;
DECLARE
lv_date DATE;
BEGIN
lv_date:=GETDATE();
dbms_output.put_line(lv_date);
END;