如何在PLSQL块中声明一个函数并在select查询中调用它?

时间:2016-02-16 07:41:56

标签: sql oracle plsql

我有这样的代码 - :

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

如果我在没有选择查询的情况下调用该函数,它可以正常工作。 请帮忙。

2 个答案:

答案 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;