PL/SQL 函数参数

Posted

技术标签:

【中文标题】PL/SQL 函数参数【英文标题】:PL/SQL function parameter 【发布时间】:2012-07-01 14:23:39 【问题描述】:

在 PL/SQL 中,下面的代码将失败。它不允许为 varchar2 参数定义大小。你知道为什么吗?我该如何解决?

create or replace function logMessage(msg varchar2(2000))
return number as
begin
    null;    
    return 1;
end logMessage;
/

错误信息是

1/33 PLS-00103:预期时遇到符号“(” 以下之一:

:= 。 ) , @ % 默认字符 符号“:=”被替换 "(" 继续。

【问题讨论】:

【参考方案1】:

您可以通过删除大小限制来修复它。不需要:

create or replace function logMessage (msg in varchar2)
return number is
begin
    null;    
    return 1;
end logMessage;
/

我假设你的函数比这稍微复杂一些?

create function 语句 from the documentation 的完整语法是:

CREATE [OR REPLACE] FUNCTION [Owner.]FunctionName 
     [(arguments [IN|OUT|IN OUT][NOCOPY] DataType [DEFAULT expr][,...])]
     RETURN DataType [InvokerRightsClause] [DETERMINISTIC]
     IS|AS 

the specifics 周围有很多信息,如果您有兴趣,但您可能会发现 TECH on the Net 更有用。


回答你的第一个问题为什么我不知道也找不到答案。但是to quote APC:

这很烦人,但这是 PL/SQL 的工作方式,所以我们必须忍受 它。

简单地说,您应该在运行时知道某事将持续多长时间,因此能够处理它。不过,您可以考虑以下几个选项:

如果你知道你想要消息的长度,你可以定义一个变量,它的默认值是参数的substr

create or replace function logmessage ( msg in varchar2 ) return number is

   l_msg varchar2(2000) := substr(msg,1,2000);

begin
   return 1;
end;

或者,您可以在函数本身中检查长度:

create or replace function logmessage ( msg in varchar2 ) return number is

begin

   if length(msg) > 2000 then
      return 0;
   end if;

   return 1;
end;

【讨论】:

【参考方案2】:

参数用数据类型声明,但没有数据类型长度或精度。这意味着参数可以声明为 VARCHAR2,但不会使用长度分量声明(VARCHAR2(30) 无效)。

【讨论】:

以上是关于PL/SQL 函数参数的主要内容,如果未能解决你的问题,请参考以下文章

Oracle PL/SQL 函数 - 调用者声明参数值 => 函数返回方程解

带输入参数的 Oracle PL/SQL 函数

带有参数的 PL/SQL 过程/函数从选择查询返回表

ORACLE PL/SQL:函数和可选参数,如何?

PL/Sql 函数

Oracle PL/SQL 传递行类型作为构造函数参数