这个 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 函数有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章

这个简单的块有啥问题? PL SQL

我的 PL/SQL 块有啥问题?

JDBC + PL/SQL = 这么简单,还是有啥陷阱?

oracle 的 PL/SQL 中的 & 和 : 有啥区别?

SQL 'select' 和 PL/SQL 'select' 语句有啥区别?

PL/SQL 中的“When Others Then Null”有啥不好?