vineri, 14 mai 2010

Explicatia zilei

M-am lovit si eu zilele astea de eroarea asta in oracle: ORA-06502: PL/SQL: numeric or value error: character string buffer too small.

Am cautat pe net sa vad despre ce ar putea fi vorba, nu de alta, dar in ciuda faptului ca pare evident, avand in vedere ca e vorba de oracle te poti astepta la tot felul de surprize.
Pe un blog, un om disperat deja de faptul ca nu ii putea da de capat a intrebat si el de ce se comporta asa oracle, raspunsul care mi s-a parut cel mai interesant, nu stiu daca si neaparat cel mai inteligent:
"Because Oracle is shitty that’s why".

As traduce, dar cei interesati mai mult ca sigur au inteles.

Ca sa revenim la eroarea/oroarea noastra, va dau un sfat: niciodata nu incercati sa creati stringuri kilometrice(la propriu) pe care s aincercati apoi sa le executati intr-o procedura, chiar daca la o prima privire pare cea mai usoara/rapida solutie, da chiar niciodata.

In alta ordine de idei, tot cautand azi pe net am gasit pe o gramada de site-uri o varianta de a verifica in oracle daca o tabela deja exista.

begin
select count(*) into cnt from all_tables
where table_name = 'test.table1';

Ei bine in cazul meu nu a prea functionat asa ca va recomand urmatoarea versiuen testata si verificata de moi:


EXECUTE IMMEDIATE 'select count(table_name) from ALL_TABLES
where
owner = upper(:1) and
table_name = upper(:2)'
INTO existTbl
USING p_schemaName, 'tempcandidates';

if existTbl = 0 then
EXECUTE IMMEDIATE 'CREATE GLOBAL TEMPORARY TABLE IF NOT EXISTS tempcandidates (
val VARCHAR(255),
cnt NUMBER(10))
ON COMMIT DELETE ROWS';
end if;