Questa eccezione viene sollevata ogni volta che un'istruzione SELECT INTO viene eseguita e trova più di una riga. Un'istruzione SELECT INTO prevede di trovare esattamente una riga, né più né meno, altrimenti viene sollevata un'eccezione.
Nel tuo esempio:
select PK into wsID from RPT_WEBSVC
where KEYVALUE = 'GetMachineNameList'
and category_fk = catID;
sembra che dovrebbe esserci solo una riga per combinazione (KEYVALUE, CATEGORY_FK), ma in realtà non è così. Se dovrebbe essercene solo una, la tabella dovrebbe avere un vincolo univoco su quelle colonne:
alter table RPT_WEBSVC add constraint RPT_WEBSVC_UK
unique (KEYVALUE, CATEGORY_FK);
Ciò impedirebbe a qualcuno (o a qualche processo) di aggiungere nuovamente la stessa riga. Ovviamente dovresti deduplicare la tabella prima di poter aggiungere quel vincolo.