BAZĖJE ESANČIŲ PL/SQL TEKSTŲ PERŽIŪRA IR KLAIDŲ PAIEŠKA

PL/SQL programų tekstai, t.y. procedūros, funcijos arba jų paketai dažniausiai ruošiami naudojant tekstinius redaktorius, išsaugant juos kompiuterių bylose. Sutransliuoti tekstai yra saugomi Oracle bazės sisteminėse lentelėse. Tačiau šių tekstų eilučių numeracija yra skirtinga. Jeigu redaktoriuje mes matome eilutę, kurios numeris yra 93, tai daugeliu atvejų sisteminėje lentelėje esanti eilutė su numeriu 93 bus visiškai kita. Tai susiję su tuo, kad, programos transliavimo metu, tuščios eilutės iš teksto yra pašalinamos. Tai sudaro sunkumų ieškant klaidų programos tekste.

Tarkime, kad jūs norite sukurti savo procedūrų paketą, vykdydami sakinį 'CREATE OR REPLACE' ir gavote visą eilę pranešimų apie klaidas. Pranešimuose nurodyta klaidingos eilutės numeris ir klaidos pozicija. Tačiau reikalinga įdėti nemažai pastangų, norint surasti klaidingas eilutes programos tekste.

Stimulą šiam mūsų darbui davė Stiveno Feuersteino straipsnelis 'A View of Stored PL/SQL Source Code', paskelbtas žurnale 'Oracle Developer', 1995 metų gruodžio numeryje. Kartu su šiuo žurnalu pateikiamoje disketėje buvo procedūrų paketas 'SHOW', kuris išveda sisteminėje lentelėje esančių programų tekstus. Kreipinyje į procedūrą 'SHOW.CODE' nurodoma programos vardas, tipas, pradinės bei galutinės eilučių numeriai ir rezultatas išvedamas į ekraną.

Pavyzdžiui, norint išvesti pirmas dešimt procedūrų paketo 'SHOW' eilučių, reikalinga įvykdyti šią SQL*Plus komandą:

SQL> EXEC SHOW.CODE(SHOW', 'P', 1, 10);

====================================================
=      Code for PACKAGE SHOW
====================================================
Line#  Source
====================================================
=    1 PACKAGE Show
=    2 /*
=    3 || Author: Saulius Marčiulaitis, Vitas Povilaitis
=    4 || Copyright (c) 1996 All Rights Reserved.
=    5 ||
=    6 ||   File: show.opb
=    7 */
=    8 IS
=    9 PROCEDURE Set_Type ( type_in IN VARCHAR2 );
=   10 FUNCTION Deftype RETURN VARCHAR2;

Naudojantis šia procedūra, nesunkiai nustatomos klaidingas programos eilutės.

Antras procedūros parametras gali įgyti šias reikšmes:

    P    - Procedūrų paketo aprašymas;
    B    - Procedūrų paketo kūmas;
    PR   - Atskira procedūra (neįeinanti į paketą),
    F    - Atskira funkcija (neįeinanti į paketą).

Tiek programos modulio vardą, tiek tipą galima rašyti ir didžiosiomis, ir mažosiomis raidėmis. Nenurodžius pradžios ir pabaigos eilučių, bus išvedamas pilnas tekstas.

Mūsų parašyta nauja procedūra yra 'ERRORS', kuri išveda nurodyto programos modulio klaidingas eilutes ir jų gretimas (penkias prieš ir penkias po), kartu nurodant klaidos poziciją bei klaidos pranešimus.

Pavyzdžiui, turime procedūrų paketo sukūrimo programą, kurią paleidžiame vykdydami SQL*Plus komandą:

SQL> @banko_istaigos.opb
Creating Package Body BANKO_ISTAIGOS_A_PAC

Warning: Package Body created with compilation errors.

Errors for PACKAGE BODY BANKO_ISTAIGOS_A_PAC:

LINE/COL ERROR
-------- -----------------------------------------------------------------
186/42   PLS-00103: Encountered the symbol ";" when
         expecting one of the following:
         := ) , default
         The symbol ", was inserted before ";" to continue.

Įvykdydami šią SQL*Plus komandą, gauname tokį rezultatą:

SQL>EXEC SHOW.ERRORS('BANKO_ISTAIGOS_A_PAC', 'B' );

====================================================
=   Code and Errors for PACKAGE BODY BANKO_ISTAIGOS_A_PAC
====================================================
Line#  Source
====================================================
====================================================
=  181   BANKO_ISTAIGOS_H_PAC.Pre_Proc ( p_Oper, p_Old, p_New );
=  182  END Pre_Proc;
=  183  -- BANKO_ISTAIGOS_A Veiksmai atliekami po pagrindinio veiksmo
=  184  PROCEDURE Post_Proc(
=  185   p_Oper  IN NUMBER ,
=  186   p_Old   IN OUT BANKO_ISTAIGOS_A%rowtype;
=ERROR ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!
=ERROR PLS-00103: Encountered the symbol ";" when expecting one of the
=      following:     := ) , default The symbol ", was inserted before
=       ";" to continue.
=ERROR ---------------------------------------------------------------!
=  187   p_New   IN OUT BANKO_ISTAIGOS_A%rowtype )
=  188  IS
=  189  BEGIN
=  190   IF p_Oper = Oper_Pac.Oper_Select THEN
=  191    p_New := p_Old;
====================================================

Informacijos išvedimui procedūrose 'SHOW' ir 'ERRORS' yra naudojama sisteminė procedūra 'DBMS_OUTPUT.PUT_LINE', todėl, prieš naudojantis jomis, reikia įvykdyti šią SQL*Plus komandą:

SQL>SET SERVEROUTPUT ON SIZE n

Parametras SIZE nurodo išvedimui išskiriamos atminties kiekį baitais, kurio reikšmė gali būti nuo 2,000 (pagal nutylėjimą) iki 1,000,000.

Stiveno Feuersteino programoje informacija yra imama iš sisteminės lentelės (view'o) 'USER_SOURCE'. Tačiau tai nėra gerai, jeigu paketu nori naudotis keletas vartotojų. Procedūrų paketas yra vykdomas su jį sukūrusio vartotojo privilegijomis, bet ne jį vykdančiojo. Tai reiškia, kad jeigu aš suteikiau vartotojui vykdymo teisę šiam paketui, tai jis gali matyti mano programų tekstus, bet savo jis nematys!!! Šiuo atveju kiekvienas vartotojas savo vardu privalo susikurti paketą 'SHOW', t.y 20 vartotojų - 20 tokių pačių paketų.

Kitas variantas - panaudoti view'ą 'ALL_SOURCE'. Tačiau šiuo atveju vartotojas, norėdamas pasinaudoti mano paketu, privalo suteikti man vykdymo (EXECUTE) teisę į savo programas. Tai irgi nėra gerai.

Mūsų eksperimentai parodė, kad geriausias sprendimas yra panaudoti view'us 'DBA_SOURCE' ir 'DBA_ERRORS', sukurti paketą SYS vardu ir suteikti vykdymo (EXECUTE) privilegiją visiems (PUBLIC). Šios komandos yra įtrauktos į paketą 'SHOW'.

Mes tikimės, kad šis paketas gali būti naudingas ir kitiems vartotojams. Dėl jo įsigijimo (nemokamai) prašome kreiptis į šio straipsnio autorius. Taip pat laukiame pasiūlymų ir pastabų.

Taip pat galite paimti ir paketo tekstą.


Vitas Saulius Marčiulaitis
Lietuvos Banko Apskaitos ir informacinių technologijų departamento grupės vedėjas
Darbo telefonas 72-11-76
E-Mail: saulius@mail.lbank.lt
Saulius Vitas Povilaitis
Lietuvos Banko Apskaitos ir informacinių technologijų departamento vyriausias projekto konstruktorius
Darbo telefonas 72-11-76
E_Mail: vitasp@mail.lbank.lt.