在ORACLE的select语句中从PL/SQL调用函数

在ORACLE的select语句中从PL/SQL调用函数,oracle,plsql,Oracle,Plsql,下面是我的PL/SQL函数部分。我试图在select语句中使用该函数。例如,我们可以编写一个查询,如从表\u name中选择count(列\u name)。这里count是一个函数。我想像这样使用我自己的函数。我尝试了不同的方法(在PL/SQL函数外部使用函数,在PL/SQL函数内部使用函数)。但是它抛出一个错误:当在PL/SQL函数内部使用时,函数“GET\u ANNUAL\u COMP”不能在SQL中使用,当在PL/SQL函数外部使用时,抛出一个无效标识符 我正在使用oracle 11g d

下面是我的PL/SQL函数部分。我试图在select语句中使用该函数。例如,我们可以编写一个查询,如
从表\u name
中选择count(列\u name)。这里count是一个函数。我想像这样使用我自己的函数。我尝试了不同的方法(在PL/SQL函数外部使用函数,在PL/SQL函数内部使用函数)。但是它抛出一个错误:当在PL/SQL函数内部使用时,函数“GET\u ANNUAL\u COMP”不能在SQL中使用,当在PL/SQL函数外部使用时,抛出一个无效标识符

我正在使用oracle 11g

declare
em_sal number(20);
em_comm employees.commission_pct%type; 
annual_salary number(10,4);

function get_annual_comp(sal in number, comm in number)
return number is
begin
return (sal*12 + comm*12);
end;
begin
select salary into em_sal from employees where employee_id=149;
select commission_pct into em_comm from employees where employee_id=149;

annual_salary := get_annual_comp(em_sal,em_comm);

dbms_output.put_line('total salary '|| annual_salary);

select get_annual_comp(salary,commission_pct) from employees where department_id=90;
end;
/

在适当的模式(将运行匿名块的sames模式)中编译函数,如下所示:

CREATE OR REPLACE FUNCTION GET_ANNUAL_COMP(
    sal  IN NUMBER,
    comm IN NUMBER)
  RETURN NUMBER
IS
BEGIN
  RETURN (sal*12 + comm*12);
END;
使用与函数相同的架构,运行匿名块:

DECLARE
  em_sal NUMBER(20);
  em_comm employees.commission_pct%type;
  annual_salary NUMBER(10,4);
BEGIN
  SELECT salary INTO em_sal FROM employees WHERE employee_id=149;
  SELECT commission_pct INTO em_comm FROM employees WHERE employee_id=149;
  annual_salary := get_annual_comp(em_sal,em_comm);
  dbms_output.put_line('total salary '|| annual_salary);
  SELECT SUM(get_annual_comp(salary,commission_pct)) into annual_salary
  FROM employees
  WHERE department_id=90;
  dbms_output.put_line('department annual salary '|| annual_salary);
END;
/

全局创建函数。还要确保函数是在同一架构中创建的,并且登录用户在该架构中具有必要的权限

要与
SQL
一起使用,该函数已使用
CREATE或REPLACE…
编译为DB对象,因此错误准确地显示在
PL/SQL
中,因为它在其块中看到了一个范围。。当我们从外部尝试时,它甚至无法识别,因此
无效标识符
。因此,当您希望使用
SQL
时,您必须全局创建函数。您真的需要在PL/SQL匿名块中使用此函数吗?@MaheswaranRavisankar btw,在12c中不再需要它,您可以在sqlOh cool中内联plsql函数,谢谢您的信息@当然,我还没有机会探索12c@马赫斯瓦兰拉维桑卡