Essa exceção é gerada sempre que uma instrução SELECT INTO é executada e encontra mais de uma linha. Uma instrução SELECT INTO espera encontrar exatamente uma linha, nem mais nem menos - caso contrário, uma exceção é gerada.
No seu exemplo:
select PK into wsID from RPT_WEBSVC
where KEYVALUE = 'GetMachineNameList'
and category_fk = catID;
parece que deve haver apenas uma linha por combinação (KEYVALUE, CATEGORY_FK), mas na verdade esse não é o caso. Se houver apenas um, a tabela deverá ter uma restrição exclusiva nessas colunas:
alter table RPT_WEBSVC add constraint RPT_WEBSVC_UK
unique (KEYVALUE, CATEGORY_FK);
Isso impediria que alguém (ou algum processo) adicionasse a mesma linha novamente. É claro que você precisaria desduplicar a tabela antes de poder adicionar essa restrição.