测试函数错误 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)。
我正在尝试创建一个 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)。