Cette exception est déclenchée chaque fois qu'une instruction SELECT INTO est exécutée et trouve plusieurs lignes. Une instruction SELECT INTO s'attend à trouver exactement une ligne, ni plus ni moins - sinon une exception est levée.
Dans votre exemple :
select PK into wsID from RPT_WEBSVC
where KEYVALUE = 'GetMachineNameList'
and category_fk = catID;
il semble qu'il ne devrait y avoir qu'une seule ligne par combinaison (KEYVALUE, CATEGORY_FK), mais en fait ce n'est pas le cas. S'il ne doit y en avoir qu'un, la table doit avoir une contrainte unique sur ces colonnes :
alter table RPT_WEBSVC add constraint RPT_WEBSVC_UK
unique (KEYVALUE, CATEGORY_FK);
Cela empêcherait quelqu'un (ou un processus) d'ajouter à nouveau la même ligne. Bien sûr, vous devrez dédupliquer la table avant de pouvoir ajouter cette contrainte.