PL / SQL函数有什么问题?

时间:2019-06-11 11:44:41

标签: oracle function plsql syntax

我有一个声明如下的函数:

FUNCTION NewLogEntry(
  is_warning IN NUMBER, 
  log_msg IN VARCHAR2) RETURN log_entry
IS
  e log_entry;
BEGIN
  e.is_warning := is_warning;
  e.log_msg := log_msg;
  return(e);
END NewLogEntry;

TYPE log_array IS VARRAY(5000) OF log_entry;

当然TYPE log_array不是函数的一部分,但它位于产生编译错误的行上:

PLS-00103: Encountered the symbol "TYPE" when expecting one of the following:     begin function pragma procedure 

顺便说一句,log_entry被声明为:

TYPE log_entry IS RECORD 
(
  is_warning BOOLEAN,
  log_msg VARCHAR2(2000)
);

我的函数语法出了什么问题?

1 个答案:

答案 0 :(得分:1)

如果您希望函数可以看到声明的类型(作为RECORD),则需要在包定义中使用它,例如

create or replace
package MY_TYPES is

TYPE log_entry IS RECORD 
(
  is_warning BOOLEAN,
  log_msg VARCHAR2(2000)
);

end;

然后您就可以

create or replace
FUNCTION NewLogEntry(
  is_warning IN NUMBER, 
  log_msg IN VARCHAR2) RETURN MY_TYPES.log_entry
IS
  e MY_TYPES.log_entry;
BEGIN
  e.is_warning := is_warning;
  e.log_msg := log_msg;
  return(e);
END NewLogEntry;

还有其他方法可以做到这一点,但这应该会让您感动。这是一些输出

SQL> create or replace
  2  package MY_TYPES is
  3
  4  TYPE log_entry IS RECORD
  5  (
  6    is_warning BOOLEAN,
  7    log_msg VARCHAR2(2000)
  8  );
  9
 10  end;
 11  /

Package created.

SQL>
SQL> create or replace
  2  FUNCTION NewLogEntry(
  3    is_warning IN boolean,
  4    log_msg IN VARCHAR2) RETURN MY_TYPES.log_entry
  5  IS
  6    e MY_TYPES.log_entry;
  7  BEGIN
  8    e.is_warning := is_warning;
  9    e.log_msg := log_msg;
 10    return(e);
 11  END NewLogEntry;
 12  /

Function created.