PL / SQL函数检查长度并构建一个字符串

时间:2012-12-18 19:21:18

标签: sql plsql oracle11g

我创建了一个包含聚合值的列的VIEW(以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:遇到符号“。”当期待以下之一时:。 (),*%&amp; = - +&lt; /&gt; at in mod mod not rem =&gt; &LT;&GT;或!=或〜=&gt; =&lt; =&lt;&gt;和/或喜欢喜欢喜欢的喜欢...之间的|| member submultiset符号“。”被忽略了。

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

1 个答案:

答案 0 :(得分:1)

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

  • 首先,你的函数应该接受一个参数吗?在函数名FUNCTION suburl(之后有一个开放的paren,这意味着你确实希望传入一个参数。但是你没有声明一个参数,你只需从你的函数体开始。删除该打开的paren或添加要传入的参数的声明。
  • 其次,您正在使用未声明的局部变量v_lengthv_result_string。你需要申报那些。如果v_resultl_string应该是第三个变量而不是v_result_string的拼写错误,那么您也需要声明它。
  • 第三,你错过了开始和结束功能主体的BEGINEND

函数声明的框架类似于

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

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

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