Yea, privileges and procedures are confusing.
Check out definer rights and invoker rights in the concept guide.

In summary, you're probably executing with definer rights, which means that the only privilege the user running it needs is execute on the procedure. This is because when the procedure is executed, it executes with the privileges of the procedure's owner, not the user who runs it.

However, the procedure owner must have the privileges on the underlying objects granted directly to them, not through a role. This is because all roles in the session are disabled while the procedure is executing (with definer rights).

As far as your problem goes, the procedure which works does so because the procedure owner has the update privilege. You'll need to check out why the other procedure doesn't work. Maybe invokers rights/privileges/whatever (invoker rights work differently, but you can check that out yourself).