Warning: Declaration of Suffusion_MM_Walker::start_el(&$output, $item, $depth, $args) should be compatible with Walker_Nav_Menu::start_el(&$output, $item, $depth = 0, $args = Array, $id = 0) in /DISK2/WWW/plsql.cz/www/wp-content/themes/suffusion/library/suffusion-walkers.php on line 0
Apr 032014
 

Všichni známe velkou trojku – SQL Developer, TOAD a PL/SQL Developer. Osobně mám z nich nejraději právě PL/SQL Developera – více užitečný než SQL Developer a né tak připlácaný jako TOAD. Dnes jen krátká informace – vyšla jeho nová major verze s číslem 10. V rychlosti co je to obsahuje:

  • Jednodušší možnost přepínání edicí. Tedy místo ALTER SESSION již stačí klikat.
  • To samé platí pro Workspace – možnost výběru pod kterým Workspace chce developer pracovat. Tedy místo DBMS_WM.GoToWorkspace opět klikání.
  • Pokud napíšete jméno objektu delší než 30 znaků tak se podrhne červeně.
  • Párování závorek v editoru ať je kurzor před či za závorkou.
  • Export dat přímo do clipboardu (a krásně i verzi v jaké to chceme – txt/csv..).
  • Podpora chainů pro DBMS_SCHEDULER.
  • a něco hodně dalšího..

Celý list nových features lze vyčíst zde: http://www.allroundautomations.com/bodyplsqldev100.html

Myslím, že dobrý ;) Workspace/Edice asi moc programátorů nepouživá, ale spousta novinek se zajisté hodí. V listu jsem spoustu věcí nezmínil, takže je třeba si ti projet co je užitečné a co patří kočičkám. Enjoy!

 Posted by at 21:51
Mar 232014
 

Tento blog je online od února 2011 a je na čase udělat nějaké to čištění. Od uvedeného data se mi podařilo ve wordpressu úspěšně rozepsat a nezveřejnit několik postů. A co je možné bych rád zpětně pročistil, dopsal či bez návratu odstranil. Důvody nedopsání jsou různé od časových až po takové, kde jsem zjistil, že to tak jednoduché nebude – napříkad mi tu straší článek o tom jak založit tabulku. Moje představa byla založení tabulky pomocí insertů do datového slovníku pod SYSem, modifikace datových bloků, dopočítání kontrolních součtů atd. A musím říct, že jsem nebyl úspěšný – tabulku se mi daří téměř správně založit, funguje describe, select a vše vypadá korektně, ale insert se prostě nedaří (internal error oracle). A od té doby jsem se k tomu nedostal. Rozepsaných a slíbených postů, které jsem nezveřejnil bych se rád postupně zbavil.

Před dvěma lety jsem měl  plánu napsat post o hintu IGNORE_ROW_ON_DUPKEY_INDEX, který patří mezi ty specifické, které mění chování a nevěnují se optimalizaci. Oracle ho uvádí společně tyto hinty: CHANGE_DUPKEY_ERROR_INDEX, IGNORE_ROW_ON_DUPKEY_INDEX a RETRY_ON_ROW_CHANGE. A když už jsem v tom, rovnou je zkusme všechny ;. A začněme hned tím prvním CHANGE_DUPKEY_ERROR_INDEX.

CHANGE_DUPKEY_ERROR_INDEX – Umí změnit typ chyby v případě, že dojde k porušení unikátnosti. Konkrétně z ORA-001 udělá ORA-38911. K čemu je to dobré? Například pokud jsou nad tabulkou dva různé unikátní sloupce a jednoduššímu zjištění ve kterém ze zmíněných došlo k porušení unikátnosti. Hint lze použít v INSERT a UPDATE statementu. Takže příklad:

create table tbl_unique_hint_test as
select rownum as first_unique,
rownum as second_unique
from dual connect by level<6;

Synaxe je následující:

Tedy takto:

insert /*+CHANGE_DUPKEY_ERROR_INDEX(tbl_unique_hint_test(first_unique)) */ into tbl_unique_hint_test values (1,1);
SQL Error: ORA-38913: Index zadaný v tipu k indexu není platný

Vyhučelo na chybě. I když jde zadat pro zjištění unikátnosti místo indexu sloupce, tak není možné zadat sloupce na kterých není unikátní index/constraint. Dokumentace píše, že je to nutné toto omezení mín, ale nepíše co se stane když není – odpověď je tedy ORA-38913. Takže založení unikátního indexu nad sloupcem first_unique:

create unique index inx_unique_first on tbl_unique_hint_test(first_unique);

A opět test hintu:

create unique index inx_unique_first on tbl_unique_hint_test(first_unique);
unique index INX_UNIQUE_FIRST created.
insert /*+CHANGE_DUPKEY_ERROR_INDEX(tbl_unique_hint_test(first_unique)) */ into tbl_unique_hint_test values (1,1);
SQL Error: ORA-38911: nesplněna podmínka jedinečnosti (APEX_WORKOUT.INX_UNIQUE_FIRST)

Fajn, číslo chyby je jiné. Ale daleko zajímavější je to takto:

create unique index inx_unique_second on tbl_unique_hint_test(second_unique);
unique index INX_UNIQUE_SECOND created.
insert /*+CHANGE_DUPKEY_ERROR_INDEX(tbl_unique_hint_test(second_unique)) */ into tbl_unique_hint_test values (1,1);
SQL Error: ORA-38911: nesplněna podmínka jedinečnosti (APEX_WORKOUT.INX_UNIQUE_SECOND)

Nyní když jsou nad tabulkou unikátní dva indexy má nová chyba ORA-38911 přednost ORA-001. Tedy místo toho, aby příkaz vyhuče na duplikaci nad sloupcem FIRST_UNIQUE, protože hodnota 1 již tam je, vyhučí na ORA-38911 pro sloupec SECOND_UNIQUE.

 Posted by at 00:05
Mar 162011
 

Dneska jsem v práci smutně povzdechnul, když mi při kompilaci balíku napsal Oracle, že zde sekvenci a především její .NEXTVAL nemohu použít. Oracle 11g by mi to ale již dovolil – od verze 11gR1 lze použít sekvenci a její .CURRVAL a .NEXTVAL kdekoliv kde je možné použít číslo nebo výraz, který vrací číslo.  Krása, ne? Konečně nebude muset člověk selectovat z dualu .NEXTVAL aby jí dostal do proměnné. Od Oracle 11g ji stačí přiřadit, zrovnatak jí lze sčítat ve VARCHAR2 a nebo třeba použít v CASE kluazuli, jak se komu líbí.

Budu za tuto změnu vděčen, nejedná se o funkcionalitu, která by měla významný pozitivní dopad na výkon (i když pochopitelně nepatrný má), ale ušetří to člověku čas a také nervy ;)

Inu, ať žije n_ORACLE PLS_INTEGER:=seq_11G.NEXTVAL;

 

 Posted by at 00:41
Mar 052011
 

Kromě příkazu CONTINUE (a CONTINUE WHEN) se samozřejmě těším na to, až budu moci i na produkční databázi pracovat s ostatními novinkami a úpravami z Oracle 11g (a dalšími release).  Jednou z věcí, která nás na produkčním prostředí nyní trápí je nemožnost spouštět v EXECUTE IMMEDIATE a především v DBMS_SQL scripty a kódy delší než 32767 znaků (tzn. VARCHAR2).  Vadí nám to především u jobu, kterým ze selectu generujujeme scripty a pomocí kterých pak stahujeme data z okolních systémů před db link do naší databáze.  Obecně generované scripty jsou delší než ručně napsané a tedy granice 32kb je pro nás vcelku omezující.  Jediné řešení, které aktuálně aplikujeme je odstranění jakéhokoliv formátování, jakékoliv mezery, která tam být nemusí a jakéhokoliv přebytečného řádku.

Oracle 11R2 nabízí spouštění kódu v CLOBu pomocí jak EXECUTE IMMEDIATE, tak pomocí DBMS_SQL. Dost bylo odstraňování bílých znaků z SQL selectů a PL/SQL kódu.

 Posted by at 14:39
Mar 022011
 

Firma Oracle /pro mne z nepochopitelných důvodů/ až do verze 10g neumožňovala v PL/SQL cyklech používat slovo CONTINUE (tedy přerušení zpracování konkrétního cyklu a pokračování další interací) a tato funkcionalita byla přdána až v 11g, což si velice pochvaluji – ne, že bych to snad mohl použít, protože naše firma stále použivá verzi 10g a nějaký pátek ještě bude, ale už se těším až budu moci používat CONTINUE místo IFů či jiných způsobů jak si tuto funkcionalitu zajistit, rozhodně to kód zpřehlední.  Popravdě neznám, žádný modernější jazyk (Java, C++, Perl), který by CONTINUE takto dlouho nepodporoval (o proti GO TO například, které PL/SQL naopak podporuje téměř od svého počátku).  Krásné na tom také je, že PL/SQL umožňuje CONTINUE ve dvou formách :

  • CONTINUE;
  • CONTINUE WHEN (podminka);

Tedy stejně jako EXIT bez podmínky a s podmínku a tedy možností vyhnutí se dalšímu ifu a zlepšení čtení kódu.

 Posted by at 23:31