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;

vineri, 19 martie 2010

Din categoria tutoriale/pentru incepatori

Grrrrrr! In sfarsit am scapat de iarna, de frig, de ninsoare si drumuri blocate! Asta ar fi partea buna, partea rea e ca ne loveste astenia de primavara si ne e greu si sa ne dam jos din pat, ce sa mai vorbim de codat ...

Dar pentru entuziasti si mai ales pentru incepatorii intr-ale java, un mic exercitiu pentru dezmortit degetele pe tastatura, foarte folositor in viata de zi cu zi, crearea unui fisier text.


import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.File;
import java.io.Writer;
import java.io.FileNotFoundException;
import java.io.IOException;

public class CreateTextFile
{
public static void main(String[] args)
{
Writer writer = null;

try
{
String text4File = "De creat un fisier text cu ce avem aici";

String fileName = "fisier.txt";

File newFile = new File(fileName);
writer = new BufferedWriter(new FileWriter(newFile));
writer.write(text4File);

} catch (FileNotFoundException e)
{
e.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
} finally
{
try
{
if (writer != null)
{
writer.close();
}
} catch (IOException e)
{
e.printStackTrace();
}
}
}
}


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;

miercuri, 27 ianuarie 2010

Banc de programatori

If someone asks you for the bit depth of a boolean, look them straight in the eye and say, "That's virtual-machine dependent." They'll be impressed.

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;

vineri, 22 ianuarie 2010

Eroare ORA-00972

Nu mai lucrasem de mult pe Oracle asa ca astazi in momentul in care am incercat sa creez niste tabele noi m-am lovit din nou de aceasta eroare: ORA-00972: identifier is too long.
Daca faceti o cautare rapida pe google, veti descoperi ca e vorba despre un identificator, nume tabela, nume coloana, nume index, nume cheie mai lung de 30 de caractere . Era de-a dreptul evident, nu?

joi, 14 ianuarie 2010

Functie in JavaScript

Astazi m-am chinuit vreo 10 minute la un form banal dintr-o pagina, ceva ce am mai facut de zeci si sute de ori, la propriu, acum numai nu imi iesea.

Despre ce e vorba, un form simplu de tot cu un select si o functie banala in JavaScript care sa recupereze valoarea optiunii selectate si sa faca submit pe form. Done in 60 seconds? Nu prea si asta pentru ca orele de nesomn isi spun cuvantul si mintea zboara aiurea: am denumit la fel form-ul si functia, asa ca primeam o eroare de toata frumusetea cum ca x nu e functie (setC is not a function).

Neobservand problema numelui ma uitam ca boul la poarta noua la eroare si functie, am rescris functia, luat copy paste numele sa nu fi incurcat vreo litera, am luat inclusiv o functie din alta pagina si redenumit-o, dar la fel... Noroc ca intr-un final mi s-au deschis ochii si am vazut ce boroboanta mare am facut. Am redenumit functia si a mers ca uns.

Daca va loviti si voi de eroarea asta si codul functie e ok, verificati si restul elementelor din pagina deoarece problema se trage de acolo.

Sfatul pe ziua de azi, oricata experienta, vechime ai, daca esti obosit, casca de doua ori ochii inainte sa faci ceva!