joi, 11 iunie 2015

Oracle - how to kill a running select

It may come in handy when thniks go crazy.

1. To find the sid, session id, and the serial#, serial number run the following select:
select s.sid, s.serial#, p.spid, s.username, s.schemaname
     , s.program, s.terminal, s.osuser
  from v$session s
  join v$process p
    on s.paddr = p.addr
 where s.type != 'BACKGROUND'
 and s.username = 'FEES';
2.Kill the session
 alter system kill session 'sid,serial#' immediate;

The source of the solution

Bancul zilei:
La deschiderea unui heapdump primesc eroarea de OutOfMemoryError.

miercuri, 2 mai 2012

ORA-12519

Rezolvarea pentru eroarea asta:

ALTER SYSTEM SET PROCESSES=150 SCOPE=SPFILE;
sau modificat direct in fisierul de configurare init.ora

LDAP

LDAP = Lightweight Directory Access Protocol

Purpose

The Lightweight Directory Access Protocol (LDAP) is a directory service protocol that runs on a layer above the TCP/IP stack. It provides a mechanism used to connect to, search, and modify Internet directories.

The LDAP directory service is based on a client-server model. The function of LDAP is to enable access to an existing directory.

The data model (data and namespace) of LDAP is similar to that of the X.500 OSI directory service, but with lower resource requirements. The associated LDAP API simplifies writing Internet directory service applications.

Where applicable
The LDAP API is applicable to directory management and browser applications that do not have directory service support as their primary function. Conversely, LDAP is neither applicable to creating directories, nor specifying how a directory service operates.

Developer audience

The LDAP API documentation in the Platform Software Development Kit (SDK) is intended for experienced C and C++ programmers and Internet directory developers.

LDAP supports the C and C++ programming languages.

A familiarity with directory services and the LDAP Client/Server Model are necessary for the development with the LDAP API.

Run-time requirements
Client applications that use the LDAP API, run on Windows Vista, Windows XP, and Windows 2000. All platforms must have TCP/IP installed.
Active Directory servers that support client applications using the LDAP API include Windows Server 2008, Windows Server 2003, and Windows 2000 Server.


wiki
msdn

luni, 5 septembrie 2011

Oracle Validare Rapida pe Insert

O varianta prescurtata pentru validarea existentei unei inregistrari in momentul in care se doreste a se face un insert intr-o tabela:


INSERT INTO tabela
(id, label, status)
SELECT 1, 'label value', 'done'
FROM dual
WHERE not exists (select * from tabela
where tabela.id = 1 and tabela.label =
'label value' and tabela.status = 'done');


In exemplul de mai sus, in cazul in care exista o inregistrare cu valorile pe acre dorm sa le scriem nu se va insera o noua inregistrare, in caz contrar se va insera o inregistrare noua in tabela.

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;

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!

miercuri, 21 octombrie 2009

Good old HTML (Problema HTML)

De cateva zile ma confruntam cu o problema destul de spinoasa, pentru mine binenteles. Aveam intr-un rand html doua imagini cu link-uri pe ele care erau usor deplasate in jos si nu intelegeam de ce, cu atat mai mult cu cat imaginile nu aveau dimensiuni mai mari decat randul respectiv, borderul era setat pe 0, la tabel la fel scos cellspacing-ul si cellpadding-ul, ce mai o adevarata enigma!

Cam asa arata problema mea:



Am incercat de toate, am scos imaginile nici un efect, am incercat tot felul de alinieri, modificat dimensiunile, si tot nici un efect. Dupa mai multe incercari m-am dat batuta cu atat mai mult cu cat nu intelegeam de unde poate veni problema. Astazi m-am intors la codul buclucas si l-am intrebat si pe nea' gogu cam care ar putea fi problema cu atat mai mult cu cat ajunsesem la concluzia ca tagurile <a> sunt de vina.

Gasisem pe un site cum ca problema se poate trage de la dimensiunea fontului in caz ca e setat asta in stilul elemntului, altii dadeau clasica rezolvare align-ul, dar nimic nu parea sa functioneze pentru cazul meu. In disperare de cauza am zis sa mai intreb si lumea poate s-a mai lovit cineva de asa ceva si aflu solutia, dar nu am avut noroc. Spre fericirea mea(si sanatatea mea mintala) intr-un final tot nea' gogu mi-a dat raspunsul.

Se pare ca alinierea pe verticala tine cont de valoarea implicita a atributului line-height, lucru de bun simt si logic, as spune eu.Problema la mine era faptul ca inaltimea implicita a randului se modifica in momentul in care adaugam < a > si cei doi pixeli nastrusnici imi dadeau peste cap designul.
Cam asa arata acum dupa ce am modificat inaltimea elementului( <td>), partea frumoasa fiind ca functioneaza atat pe mozilla cat si pe ie :

marți, 20 octombrie 2009

Tutorial Spring pentru incepatori

Daca ati tot auzit de Spring, dar nu sunteti siguri despre ce e vorba si vreti ca la urmatorul interviu sa aveti macar habar cu ce se manaca va recomand urmatorul tutorial: Spring MVC Fast Tutorial.

Nu va asteptati sa deveniti experti peste noapte sau ca acest tutorial sa fie exhaustiv, trateaza doar o aplicatie banala in MVC, dar mi s-a parut un mod rapid si constructiv de a te initia in abc-ul Spring-ului mai ales pentru cei care urasc sa se ingroape sub tone de documentatii si vor sa vada practic ce pot face.

vineri, 2 octombrie 2009

Salvarea imaginilor intr-o baza de date versus salvarea lor intr-un sistem de fisiere

Printre primele lucruri pe care le-am invatat in momentul in care am inceput sa lucrez cu o aplicatie care administra imagini, a fost sa salvez calea in baza de date si fisierul propriu zis intr-un sistem de fisiere, de ce se prefera de obicei solutia aceasta am inteles abia pe parcurs.

Avantajele salvarii imaginilor intr-un sistem de fisiere si calea catre ele in baza de date:
  • posibilitatea aparitiei de incompatibilitati, in cazul migrarii catre o alta platforma de baze de date, intre vechiul si noul tip de date;
  • in cazul aparitiei de probleme la baza de date, in cazurile extreme in care sunt putine sanse de recuperare a datelor, imaginile din sistemul de fisiere nu vor fi afectate;
  • avand imaginile salvate intr-un sistem de fisere, exista posibilitatea accesarii lor directe din mai multe tipuri de aplicatii: clienti FTP, browsere etc.
  • unele baze de date au spatiul de stocare relativ redus, pe cand intr-un sistem de fisiere esti limitat doar de dimensiunea spatiului de stocare;
  • performanta: generarea unui tag <img>pe baza unei cai salvate in baza de date e mult mai rapida decat recuperarea fisierului din baza de date, copierea continutului intr-un fiser temporar pe serverul web si afisarea lui;

Avantajele salvarii imaginilor in baza de date:
  • securitate: iti poti proteja mai bine fisierele cu un SQL Server si un sistem de fisiere securizat decat intr-un sistem de fisiere obisnuit;
  • la pastrarea imaginilor intr-un sistem de fisiere pot aparea complicatii la sincronizarea informatiilor din baza de date si sistemul de fisiere, de exemplu la stergerea datelor despre imagine din baza de date de unde stie sistemul de fisiere ca trebuie sa stearga si el imaginea;
  • performanta: pentru imagini cu dimensiuni reduse unele servere de baze de date pot recupera fisierul de pana la de 2 ori mai repede decat un sistem de fisiere;

joi, 1 octombrie 2009

Sa o luam de la inceput....

Lucrez de ceva vreme in domeniul IT, dar nu as putea spune ca sunt cine stie ce guru sau pasionata, dimpotriva, in timpul facultatii sustineam sus si tare ca nu o sa ajung programator niciodata. Cum tocmeala e acasa nu se potriveste cu cea din targ, am ajuns si eu sa butonez toata ziua buna ziua.

La un asa program(zi lumina) nu putine sunt zilele in care cate o problema imi da batai de cap, ba cateodata trece ceva vreme pana gasesc solutia cea mai potrivita. Ce ma ajuta in astfel de momente e documentatia online si mai ales site-urile in care oamenii s-au lovit de aceeasi problema si impreuna sau singuri au gasit si o solutie. Din pacate marea majoritate a site-urilor de genul acesta sunt in limba engleza, ma rog partea cu "din pacate" e destul de relativa, pentru mine nefiind o problema asa de mare, ba chiar prefer limba engleza de multe ori pentru documentatia tehnica, nu de alta dar in limba romana unele denumiri mi se par hilare dupa ce le-am folosit ani de zile in engleza si m-am obisnuit cu ele asa.

Ideea care m-a lovit la un moment dat, din fericire nu prea tare si fara urmari dureroase, a fost sa tin un fel de jurnal cu problemele pe care le intampin si rezolvarea lor binenteles. Au fost multe motive pentru care nu am facut lucrul acesta pana acum: comoditate(ca sa nu spun lene), teama de a incepe inca ceva fara sorti de izbanda, frica de a nu da in penibil si multe altele. Astazi m-am hotarat sa imi iau inima-n dinti si sa incep acest mic experiment, daca iese ceva bine, daca nu iarasi bine.

Daca unele lucruri vi se par banale, va rog sa nu dati cu piatra, nici unul dintre noi nu s-a nascut invatat, important e sa existe vointa de a invata!

Toate astea fiind spuse sa inceapa distractia!