这个 PL/SQL 函数有啥问题?
Posted
技术标签:
【中文标题】这个 PL/SQL 函数有啥问题?【英文标题】:What is wrong with this PL/SQL function?这个 PL/SQL 函数有什么问题? 【发布时间】:2019-06-11 11:44:41 【问题描述】:我有一个函数声明如下:
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】:如果你想要一个你的函数可以看到的类型声明(作为一个记录),你需要在包定义中使用它,例如
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.
【讨论】:
您的类型和功能不匹配。一个有布尔值,一个有数字。我将更新我的答案以显示建议的更正和编译证明以上是关于这个 PL/SQL 函数有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章
oracle 的 PL/SQL 中的 & 和 : 有啥区别?