I thought maybe the ExecuteDirect would split the lines into separate statements.
But it shouldn't do that.
What happens if you do this:
sSQL := 'CREATE PROCEDURE zm_SET_COMPUTER(IN p_pcname VARCHAR(64))' + Lineending +
'NO SQL' + Lineending +
'BEGIN' + Lineending +
'END';
(so omitting the empty line)
(The backtick character should be supported but I try to avoid it if possible. Just use regular characters and no reserved keywords, then it shouldn't be needed.)