我有一个声明如下的函数:
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)
);
我的函数语法出了什么问题?
答案 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.