7

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

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

错误信息是

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

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

4

2 回答 2

10

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

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

我假设您的功能比这稍微复杂一些?

文档create function中语句的完整语法是:

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

如果您有兴趣,有很多关于细节的信息,但您可能会发现TECH on the Net更有用。


回答您的第一个问题,即为什么我不知道也找不到答案。但是引用 APC 的话

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

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

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

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;
于 2012-07-01T14:25:23.257 回答
3

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

于 2012-07-01T14:27:27.710 回答