当我编译下面的代码时,我收到一条错误消息“使用编译错误创建的函数”
create or replace function find_port(ip_ID in int) RETURN int
is
t_count number;
count varchar;
begin
select is_rail into count from table where id = ip_ID;
case
when count ='True' then t_count:=1;
when count ='False' then t_count:=0;
end case;
end;
/
答案 0 :(得分:2)
我收到一条错误消息"使用编译错误创建的函数"
所以您应该问的问题是,"如何获取PL / SQL代码的编译错误列表?"
其他人告诉您如何修复代码中的当前错误,但更重要的技能是您了解如何自己诊断代码。
Oracle是一个数据库,它将元数据存储在一组称为数据字典的特殊视图中。这些视图包含编译错误的视图。此查询适用于任何SQL环境:
select name, type, line, text -- or just *, obvs
from user_errors ue
order by ue.name, ue.type, ue.sequence;
还有ALL_ERRORS和DBA_ERRORS视图。 Find out more
在SQL * Plus中,您可以运行sho err
(show errors
的缩写)。像PL / SQL Developer或Oracle SQL Developer这样的IDE会自动显示编译错误。
一旦您知道如何获取错误的文本,您需要知道LINE
将告诉您引发错误的行。尽管存在某些类型的错误(例如缺少逗号或不匹配的括号),但指示的行可能不是实际错误所在的行。不幸的是,仍然需要解释和理解,这需要经验。
答案 1 :(得分:1)
count
是一个SQL函数,因此不是用作PL / SQL变量的更好选择。 CASE
块可以在select语句中使用。
此外,您的功能不会RETURN
任何值。
create or replace function find_port(ip_ID in int) RETURN int
is
t_count number;
begin
select case
when is_rail = 'True' then 1
when is_rail = 'False' then 0
end into t_count from yourtable where id=ip_ID;
RETURN t_count;
end;
答案 2 :(得分:1)
实际上,COUNT 可以用作PL / SQL变量:
SQL> create or replace function f_test return int is
2 count number;
3 begin
4 select 1 into count from dual;
5 return 2;
6 end;
7 /
Function created.
SQL> select f_test from dual;
F_TEST
----------
2
SQL>
但是,您无法返回:
SQL> create or replace function f_test return int is
2 count number;
3 begin
4 select 1 into count from dual;
5 return count;
6 end;
7 /
Warning: Function created with compilation errors.
SQL> show err
Errors for FUNCTION F_TEST:
LINE/COL ERROR
-------- -----------------------------------------------------------------
5/3 PL/SQL: Statement ignored
5/10 PLS-00204: function or pseudo-column 'COUNT' may be used inside a
SQL statement only
SQL>
在这里,@ priya,你可以看到如何帮助自己 - SHOW ERR会告诉你你的代码有什么问题。
除此之外,您使用的CASE声明无效;应该是这样的:
SQL> create or replace function f_test return int is
2 l_count number;
3 t_count number;
4 begin
5 select 1 into l_count from dual;
6
7 t_count := case when l_count = 1 then 1
8 when l_count = 2 then 2
9 end;
10
11 return t_count;
12 end;
13 /
Function created.
SQL> select f_test from dual;
F_TEST
----------
1
SQL>