Se afișează postările cu eticheta oracle. Afișați toate postările
Se afișează postările cu eticheta oracle. Afișați toate postările

marți, 14 iunie 2011

iar oracle...

Pentru ca sunt nevoita sa lucrez pe masini virtuale si pentru ca am prea putin spatiu pentru "manevre" (a se citi instalari si drepturi) m-am lovit de o problema destul de stupida. Un listener de oracle imi tine ocupat portul 8080 si cand vreau sa pornesc tomcat-ul se plange ca nu poate porni pentru ca cineva ii tine ocupat portul.

Varianta care mi s-a parut mie mai la indemana(poate nu e pentru toata lumea) a fost schimbarea portului la listener, nu de alta, dar nu prea vad ce cauta el pe 8080. Asa ca am gugalit un pic si am gasit urmatoarele:


-- se schimba portul din 8080 in 8081
call dbms_xdb.cfg_update(updateXML(dbms_xdb.cfg_get(), '/xdbconfig/sysconfig/protocolconfig/httpconfig/http-port/text()', 8081));

commit;

EXEC dbms_xdb.cfg_refresh;


Toate astea binenteles dupa ce te-ai logat ca dba. Daca exista in dotare un TCPView sau ceva asemanator, la o examinare "before/after" se observa ca listener-ul s-a mutat cuminte pe portul 8081. Alegerea portului ramane la latitudinea fiecaruia ca aici e chestie de gust/administrare/nevoi etc.

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;

joi, 4 martie 2010

Array in Oracle

Mai jos avem un mod de a declara un array in oracle, initializarea elementelor din array si utilizarea lor:

DECLARE
TYPE VARCHAR_ARRAY IS TABLE OF VARCHAR2(20) INDEX BY BINARY_INTEGER;
our_array
VARCHAR_ARRAY;
BEGIN
our_array(1) := 'ceva';
DBMS_OUTPUT.PUT_LINE('array(1) este '|| our_array(1));
END;


In cazul in care avem o procedura care primeste ca parametru un astfel de array, putem folosi urmatorul model:

DECLARE
TYPE VARCHAR_ARRAY IS TABLE OF VARCHAR2(20) INDEX BY BINARY_INTEGER;
our_array
VARCHAR_ARRAY;
BEGIN
our_array(1) := 'ceva';
select * from nume_procedura(
our_array(1), 'alt_parametru');
END;

marți, 26 ianuarie 2010

Modificare autoincrement in Oracle 10g

Se mai intampla, din diverse motive sa umpli o tabela cu o gramada de date pe care mai apoi sa vrei sa le stergi. Nimic mai simplu sa golesti o tabela, dar de multe ori daca avem setat un autoincrement pe cheia primara, vrem sa o luam de la capat cu numaratoarea.

Pentru a modifica valoarea de pornire a unei secvente avem urmatoarea varianta rapida:

Stergerea secventei initiale:
DROP SEQUENCE schema_name.seq_name;

Recrearea secventei cu pornire de la 1
CREATE SEQUENCE schema_name.seq_name
INCREMENT BY 1
START WITH 1
MAXVALUE 2147483647
NOCACHE;