我创建了一个包含聚合值的列的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
答案 0 :(得分:1)
您的代码中存在许多语法错误。
FUNCTION suburl(
之后有一个开放的paren,这意味着你确实希望传入一个参数。但是你没有声明一个参数,你只需从你的函数体开始。删除该打开的paren或添加要传入的参数的声明。v_length
和v_result_string
。你需要申报那些。如果v_resultl_string
应该是第三个变量而不是v_result_string
的拼写错误,那么您也需要声明它。BEGIN
和END
函数声明的框架类似于
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
代码中应该表示的省略号是什么?您是否连接的不只是col1
和col2
列?如果连接列会导致字符串长度超过4000字节,那么您遵循的代码路径对我来说就没那么有意义了。如果您只是尝试连接两列,可以简化它,但如果有更多列,那么您也需要考虑这些列。
您使用了“聚合”一词,这意味着您希望合并来自多个不同行的数据,而不是多个不同的列。实际上,如果你想要完成的是,你可以使用一个循环,或者你可以编写一个用户定义的聚合函数。