First, get into the habit of indenting your code. Every IF statement must have an END IF, and may have an ELSIF and/or ELSE statement too. If you indent the commands between these statements by a fixed amout of whitespace, it makes it much easier to see what's going on, and to spot where you have missed an END or END IF:

IF condition THEN

statement;

statement;

statement;

ELSIF condition THEN

statement;

statement;

statement;

ELSE

statement;

statement;

statement;

END IF;

Second, while anonymous BEGIN/END blocks have their uses, you don't need to wrap every PL/SQL statement in its own block. Removing all the excess BEGINs and ENDs from your code won't make any difference to Oracle, but will improve the signal-to-noise ratio for humans trying to understand your code (including you).

Check the comma's in your paramter list. It is a good practice to enclose all your SQL statemetnes in begin/exception/end blocks for ease of troubleshooting. Use SQL Developer which will format your code if not badly formed. Break the task down into smaller chunks, completing on IF/END IF before starting another. Take small bites.