Call routines are said to be more efficient than the corresponding functions.
The syntax is just a little different between call routines and functions. The call routine puts the resulting string as the 1st argument while the function puts the resulting string on the left side of "=" sign, e.g.:
CALL CATS(newstring, string1, string2)
newstring=CATS(string1, string2)
|| is another operator that concatenates the strings. But it does not automatically takes care of the leading and trailing blanks. So usually it needs to be used in conjunction with STRIP() function, e.g., strip(string1)||strip(string2). Such STRIP() function becomes an annoyance if multiple strings are being concatenated. Therefore, the CAT functions are preferred over || if the string is referred by variables. || is better to be used with literal string since there is no leading or trailing blanks.
CALL CATS or CATS: Concatenate strings and strips leading and trailing blanks.
CALL CATT or CATT: Concatenate strings and trims only the trailing blanks.
CALL CATX or CATX: Concatenate strings, strings leading and trailing blanks and separate each string with a separator string, i.e. adding extra separator between strings. The default separator is blank. e.g. CALL CATX(",", newstring, string1, string2) - concatenate string1 and string2 and separate them by ","