测试函数错误 ORA-00923

Testing a function error ORA-00923

我正在尝试创建一个 FUNCTION 来获取输入的参数的位置,该参数是在我测试该函数时输入的 id 它不起作用,它给出错误 ORA-00923

create or replace FUNCTION GET_LOCATION (l_con_id in NUMBER)
    RETURN VARCHAR2 
  AS 
    LOCATION VARCHAR2(30);
  BEGIN
    SELECT LOCATION 
      INTO LOCATION 
      FROM LDS_CONSULTANT 
      WHERE CONSULTANT_ID = l_con_id;

    RETURN LOCATION;
  END;

这是我的建议。

首先,一个简单的测试用例:

SQL> create table lds_consultant
  2  (consultant_id number,
  3   location      varchar2(30));

Table created.

SQL> insert into lds_consultant
  2    select 1, 'New York' from dual union
  3    select 2, 'London'   from dual;

2 rows created.

一个函数:

  • name 参数,使其名称与列名明显不同。让它继承列数据类型
  • return 值也是如此。在其名称前面加上,例如 "L_" 表明它是一个局部变量
  • 在 SELECT 语句中使用 MAX 函数是避免 TOO_MANY_ROWS 或 NO_DATA_FOUND 错误的简单方法。不过,我建议您在必要时妥善处理这些问题

SQL> create or replace function get_location
  2    (par_consultant_id in lds_consultant.consultant_id%type)
  3  return lds_consultant.location%type
  4  is
  5    l_location lds_consultant.location%type;
  6  begin
  7    select max(l.location)
  8      into l_location
  9      from lds_consultant l
 10      where l.consultant_id = par_consultant_id;
 11    return l_location;
 12  end;
 13  /

Function created.

最后,你的称呼方式:标准方式 selecting ... from dual:

SQL> select get_location(2)  result_1,
  2         get_location(-1) result_2
  3  from dual;

RESULT_1                       RESULT_2
------------------------------ ------------------------------
London

SQL>

[编辑]

由于 Apex 使用 PL/SQL,您必须声明一个局部变量并将该函数的结果放入其中。像这样:

declare
  l_result lds_consultant.location%type;
begin
  l_result := get_location(:P1_CONSULTANT_ID);
end;

或者,如果它是一份报告,您可以将其包含在 SELECT 语句中作为

select l.consultant_id, 
       l.consultant_name,
       get_location(l.consultant_id) location
from lds_consultant l
order by l.consultant_name;

顺便说一下,从双重选择 在 Oracle 中的任何地方都有效(包括 Apex)。