0

我创建了一个包含聚合值的列的视图(以 varchar2 数据类型存储输出)。某些记录超出了最大限制,例如 varchar2(4000)。有人建议我使用 PL/SQL 函数来检查长度并在必要时构建一个字符串。

我检查过,并试图纠正语法错误,

CREATE OR REPLACE
FUNCTION SUBURL(col1 IN VARCHAR2, col2 IN varchar2)
RETURN varchar2
IS
v_result_string varchar2(4000);
v_length varchar2(4000);
BEGIN
IF (length (col1) + length (col2) ... <= 4000) then return col1 || col2 || ...
END IF; 
-- build the string and check the length for every column you contatenate
v_result_string := col1;
if (length(v_result_string) + length (col2) > 4000) THEN
   -- add as much of col2 as you can up to a total of 4000
   v_length := 4000 - length(v_result_string);
   v_result_string := v_result_string  + substr(col2, 1, v_length);
   return v_result_string;
end if;
end suburl;

这次有两个错误,

错误(7,35):PLS-00103:遇到符号“。” 预期以下情况之一时:。( ) , * % & = - + < / > at 是 mod 余数 not rem => <> or != or ~= >= <= <> and or like like2 like4 likec as between || member submultiset 符号“.” 被忽略了。

错误(7,76):PLS-00103:遇到符号“。” 当期望以下之一时:( - + case mod new null continue avg count current max min prior sql stddev sum variance execute forall merge time timestamp interval date pipe

4

1 回答 1

1

您的代码中有许多语法错误。

  • 首先,你的函数应该接受一个参数吗?函数名称后面有一个开放括号,FUNCTION suburl(这意味着您确实希望传入一个参数。但是你没有声明一个参数,你只是从你的函数体开始。删除该打开的括号或添加要传入的参数的声明。
  • 其次,您使用的是未声明的局部v_length变量v_result_string。你需要声明这些。如果v_resultl_string应该是第三个变量而不是 的拼写错误v_result_string,您还需要声明它。
  • 第三,您缺少开始BEGINEND结束函数主体的 and

函数声明的骨架类似于

CREATE OR REPLACE FUNCTION name_of_function( parameter_list )
IS
  variable_declarations;
BEGIN
  body_of_function;
END;

除此之外,代码主体中还有许多带有不匹配括号的语法错误。

if (length(v_result_string) + length (col2) > 4000 THEN

例如,在THEN

if (length(v_result_string) + length (col2) > 4000)
then

您的代码中的省略号应该代表什么?您是否连接的不仅仅是col1andcol2列?如果连接列导致字符串长度超过 4000 字节,那么您遵循的代码路径对我来说几乎没有意义。如果您只是尝试连接两列,则可以简化它,但如果有更多列,那么您也需要考虑这些列。

您使用了“聚合”一词,这意味着您想要组合来自多个不同的数据,而不是多个不同的。如果这实际上是您要完成的任务,则可以使用循环,也可以编写用户定义的聚合函数。

于 2012-12-18T19:39:20.370 回答