在PLSQL中使用编译错误创建的函数

时间:2017-12-21 03:39:05

标签: oracle stored-procedures plsql

当我编译下面的代码时,我收到一条错误消息“使用编译错误创建的函数

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;
/

3 个答案:

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