PL / SQL函数参数

时间:2012-07-01 14:23:40

标签: oracle plsql

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

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

错误消息是

  

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

     

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

2 个答案:

答案 0 :(得分:10)

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

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;

答案 1 :(得分:3)

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