ORA-04028: cannot generate diana for object
Wednesday, 10.06.2009 – DejanZadnjih dana me baš krenulo sa čudnim Oracle greškama…
Prvo u ponedeljak dobijem jednu grešku, koju do sada u životu nisam vidio:
ORA-04028: cannot generate diana for object name
Potražio sam na MetaLinku neko objašnjenje ili rješenje, ali ne nađoh ništa korisno. Samo definiciju pojma diana (DIANA je skraćenica za ‘Descriptive Intermediate Attributed Notation for Ada‘) i obavijest, da je ova greška riješena još u verziji Oracle 8. Otkud onda odjednom ta greška kod nas u bazi sa verzijom 10g?
ORA-04028: cannot generate diana for object name
Cause: A lock conflict prevented the generation of diana for an object.
Action: Check the syntax. If no syntax errors are found, report this error to Oracle World Wide Support.PL/SQL is based on the programming language Ada. As a result, PL/SQL uses a variant of Descriptive Intermediate Attributed Notation for Ada (DIANA), which is a tree-structured intermediate language. It is defined using a meta-notation called Interface Definition Language (IDL). DIANA provides for communication internal to compilers and other tools.
DIANA is an abstract syntax tree for PL/SQL: it’s the output from the “front end” of the PL/SQL compiler (the parser and semantic analyzer). The committees that created Ada also created Diana, and any conforming Ada compiler is supposed to generate Diana. PL/SQL Diana is a modified version of the Ada Diana because PL/SQL includes SQL functionality not present in Ada.
At compile time, PL/SQL source code is translated into machine-readable m-code. Both the DIANA and m-code for a procedure or package are stored in the database. At run time, they are loaded into the shared memory pool. The DIANA is used to compile dependent procedures; the m-code is simply executed.
Greška se pojavila prilikom rekreiranja nekoliko “materialized views” (dalje u tekstu kao MV) i potom rekompilacije nekoliko PL/SQL paketa, koji su koristili te MV. Nakon što su MV rekreirani, par PL/SQL paketa su postali invalidni i prilikom ponovne rekompilacije javljali su gorenavedenu grešku ORA-04028. Pokušavao sam potom sa rekompilacijom spornih MV (ALTER MATERIALIZED VIEW COMPILE), ali da stvar bude čudnija, svaki od tih MV neposredno nakon rekompilacije postaje invalidan… Wtf!?
Ni Google mi nije pomogao, pa sam se odlučio na radikalan korak – dropnuo sam dotične MV i ponovo ih jednog po jednog kreirao. Nakon toga sam rekompilirao invalidne pakete i sve je radilo kako treba. Pojma nemam zašto se ta greška pojavila, niti kako bih ovaj problem mogao drugačije riješiti… Ako se neko susretao sa ovom greškom i zna šta raditi u tom slučaju, neka napiše komentar i pomogne meni, a vjerujem i drugima. 🙂
Druga greška se javlja pri ugniježđenom korištenju analitičkih funkcija (npr. SUM() OVER() i td.) i funkcije TO_NUMBER(string) kada string sadrži nulu (‘0’) i to u slučaju kada se radi operacija dijeljenja:
create table ora01476( num_id number, string_col varchar2(64) ); insert into ora01476 select numval, stringval from (select column_value as stringval from table (sys.ODCIVarchar2List('0','1','2','3')) ) strings, (select column_value as numval from table(sys.odcinumberlist(0, 1,2,3,4)) ) numbers; commit;
Nakon ovog upita:
select CASE WHEN num_id = 0 OR string_col='0' THEN 0 ELSE sum(num_id / TO_NUMBER(string_col)) over(partition by num_id) END as result from ora01476;
javlja se greška:
ORA-01476: divisor is equal to zero
Za ovu grešku sumnjam da je u pitanju bug, pa sam otvorio jedan Service Request na MetaLinku. Upravo sam napravio test case, da pokažem kako se greška može u svako doba reproducirati, pa da vidimo šta će stručnjaci iz Oraclea reći po ovom pitanju … Više o ovome nakon što se Service Request zatvori.
One Response to “ORA-04028: cannot generate diana for object”
Baš sam nedavno naišao na tako nešto na Ask Tom, evo linka: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:571023051648
By Djordje on Jun 10, 2009