CREATE OR REPLACE PACKAGE Show /* || Author: Saulius Marčiulaitis, Vitas Povilaitis || Copyright (c) 1996 All Rights Reserved. || || File: show1.spp */ IS PROCEDURE Set_Type ( type_in IN VARCHAR2 ); FUNCTION Deftype RETURN VARCHAR2; PROCEDURE Set_Name ( name_in IN VARCHAR2 ); FUNCTION Defname RETURN VARCHAR2; PROCEDURE Code ( name_in IN VARCHAR2 := NULL , type_in IN VARCHAR2 := NULL , st_in IN INTEGER := 1 , en_in IN INTEGER := NULL ); PROCEDURE Errors ( name_in IN VARCHAR2 := NULL , type_in IN VARCHAR2 := NULL ); END Show; / SHOW ERRORS CREATE OR REPLACE PACKAGE BODY Show /* || Author: Saulius Marčiulaitis, Vitas Povilaitis || Copyright (c) 1996 All Rights Reserved. || || File: show.spp */ IS no_name_specified EXCEPTION; objname VARCHAR2(100); objtype VARCHAR2(100); err_txt VARCHAR2(5) := ' '; vartotojas VARCHAR2(30); start_in INTEGER; end_in INTEGER; end_in2 INTEGER; CURSOR Err_Cur_Line ( name_in IN VARCHAR2 , type_in IN VARCHAR2 ) IS SELECT DISTINCT ue.line FROM dba_errors ue WHERE ue.name = name_in AND ue.type = type_in AND ue.owner = vartotojas ORDER BY ue.line; CURSOR Err_Cur_Text ( name_in IN VARCHAR2 , type_in IN VARCHAR2 , line_in IN VARCHAR2 ) IS SELECT ue.text, ue.position FROM dba_errors ue WHERE ue.name = name_in AND ue.type = type_in AND ue.line = line_in AND ue.owner = vartotojas ORDER BY ue.sequence; CURSOR Src_Cur ( name_in IN VARCHAR2 , type_in IN VARCHAR2 , start_in IN INTEGER := 1 , end_in IN INTEGER := NULL ) IS SELECT als.line, als.text FROM dba_source als WHERE als.name = name_in AND als.type = type_in AND als.owner = vartotojas AND ( als.line BETWEEN GREATEST(1, NVL (start_in, 1)) AND end_in OR end_in IS NULL ); /*--------------- Papildomi moduliai -----------------*/ PROCEDURE Set_Object ( name_inout IN OUT VARCHAR2 , type_inout IN OUT VARCHAR2 ) IS BEGIN /* Nustatome objekto vardą. */ IF name_inout IS NULL THEN name_inout := objname; END IF; IF name_inout IS NULL THEN RAISE no_name_specified; END IF; /* Nustatome objekto tipą */ IF type_inout IS NULL THEN type_inout := objtype; END IF; IF type_inout = 'P' THEN type_inout := 'PACKAGE'; ELSIF type_inout = 'B' THEN type_inout := 'PACKAGE BODY'; ELSIF type_inout = 'PR' THEN type_inout := 'PROCEDURE'; ELSIF type_inout = 'F' THEN type_inout := 'FUNCTION'; END IF; SELECT user INTO vartotojas FROM sys.dual; END Set_Object; PROCEDURE Disp_Header ( header_in IN VARCHAR2 , name_in IN VARCHAR2 , type_in IN VARCHAR2 , prefix_in IN VARCHAR2 := '=') IS BEGIN DBMS_OUTPUT.PUT_LINE ( RPAD ('=', 77, '=')); DBMS_OUTPUT.PUT_LINE ( prefix_in || ' ' || header_in || ' for ' || type_in || ' ' || name_in); DBMS_OUTPUT.PUT_LINE ( RPAD ('=', 77, '=')); DBMS_OUTPUT.PUT_LINE ( 'Line# Source'); DBMS_OUTPUT.PUT_LINE ( RPAD ('=', 77, '=')); END Disp_Header; PROCEDURE Disp_Text ( line_in IN INTEGER , text_in IN VARCHAR2 , prefix_in IN VARCHAR2 := NULL) IS len INTEGER; len1 INTEGER; len2 INTEGER; end_in2 INTEGER; text_out1 VARCHAR2(250); text_out2 VARCHAR2(2000); pref_out VARCHAR2(250); ii INTEGER; BEGIN IF line_in IS NULL THEN pref_out := prefix_in || err_txt ||' '; ELSE pref_out := prefix_in || LPAD ( TO_CHAR ( line_in ), 5) ||' '; END IF; IF err_txt = 'ERROR' THEN text_out2 := RTRIM ( TRANSLATE (text_in, 'A'||CHR(10)||CHR(9), 'A ')); ELSE text_out2 := RTRIM ( TRANSLATE (text_in, 'A'||CHR(10), 'A ')); END IF; LOOP len := LENGTH ( text_out2 ); IF len = 0 OR len IS NULL THEN EXIT; END IF; len2 := 70; IF len > len2 THEN <> FOR ii IN REVERSE 1..len2 LOOP IF SUBSTR(text_out2, ii, 1) IN (CHR(9),' ', ',', ';', '(', ')', '/', '+', '<', '>', '-', '*') THEN Disp_Text.len2 := ii; EXIT out_ii; END IF; END LOOP; text_out1 := SUBSTR(text_out2, 1, len2); text_out2 := SUBSTR(text_out2, len2+1); ELSE text_out1 := text_out2; text_out2 := NULL; END IF; DBMS_OUTPUT.PUT_LINE ( pref_out || text_out1 ); pref_out := prefix_in || ' '; END LOOP; END Disp_Text; /*--------------- Išoriniai moduliai -----------------*/ PROCEDURE Set_Type ( type_in IN VARCHAR2 ) IS BEGIN objtype := UPPER (type_in); END Set_Type; PROCEDURE Set_Name ( name_in IN VARCHAR2 ) IS BEGIN objname := UPPER (name_in); END Set_Name; FUNCTION Deftype RETURN VARCHAR2 IS BEGIN RETURN objtype; END Deftype; FUNCTION Defname RETURN VARCHAR2 IS BEGIN RETURN objname; END Defname; /* || Išveda nurodyto objekto tekstą. */ PROCEDURE Code ( name_in IN VARCHAR2 := NULL , type_in IN VARCHAR2 := NULL , st_in IN INTEGER := 1 , en_in IN INTEGER := NULL ) IS v_name VARCHAR2(100) := UPPER (name_in); v_type VARCHAR2(100) := UPPER (type_in); src_rec Src_Cur%ROWTYPE; BEGIN DBMS_OUTPUT.ENABLE(500000); err_txt := ' '; Set_Object ( v_name, v_type ); Disp_Header ( 'Code', v_name, v_type ); start_in := st_in; end_in := en_in; FOR src_rec IN Src_Cur ( v_name, v_type, start_in, end_in ) LOOP Disp_Text ( src_rec.line, src_rec.text, '=' ); END LOOP; END Code; /* || Išveda klaidingas programos eilutes kartu su klaidų aprašymais. */ PROCEDURE Errors ( name_in IN VARCHAR2 := NULL , type_in IN VARCHAR2 := NULL ) IS TYPE Err_Lines_Type IS TABLE OF NUMBER INDEX BY BINARY_INTEGER; v_name VARCHAR2(100) := UPPER (name_in); v_type VARCHAR2(100) := UPPER (type_in); src_rec Src_Cur%ROWTYPE; err_lines Err_Lines_Type; code_lines Err_Lines_Type; err_i1 BINARY_INTEGER := 0; code_i1 BINARY_INTEGER := 0; jj BINARY_INTEGER; curr_line NUMBER; max_line NUMBER; als_text VARCHAR2(2000); cc NUMBER; BEGIN DBMS_OUTPUT.ENABLE(500000); err_txt := ' '; Set_Object ( v_name, v_type ); err_i1 := 0; code_i1 := 0; SELECT MAX(als.line) INTO max_line FROM dba_source als WHERE als.name = v_name AND als.type = v_type; FOR err_rec1 IN Err_Cur_Line ( v_name, v_type ) LOOP err_i1 := err_i1 + 1; err_lines(err_i1) := err_rec1.line; start_in := GREATEST ( err_lines(err_i1) - 5, 0 ); end_in := LEAST ( err_lines(err_i1) + 5, max_line); FOR ii IN start_in..end_in LOOP code_i1 := code_i1 + 1; code_lines(code_i1) := ii; END LOOP; END LOOP; IF err_i1 = 0 THEN Disp_Text ( NULL, v_name||' (of type '||v_type||') No Errors', ' ' ); RETURN; END IF; err_txt := 'ERROR'; Disp_Header ( 'Code and Errors', v_name, v_type ); jj := 1; curr_line := -1; FOR ii IN 1..code_i1 LOOP IF curr_line < code_lines(ii) THEN IF (curr_line + 1) < code_lines(ii)THEN DBMS_OUTPUT.PUT_LINE ( RPAD ('=', 77, '=') ); END IF; curr_line := code_lines(ii); IF curr_line > 0 THEN SELECT als.text INTO als_text FROM dba_source als WHERE als.name = v_name AND als.type = v_type AND als.line = curr_line AND als.owner = vartotojas; Disp_Text (curr_line, als_text, '='); END IF; IF jj <= err_i1 THEN IF curr_line = err_lines(jj) THEN jj := jj + 1; cc := 0; FOR err_rec2 IN Err_Cur_Text ( v_name, v_type, curr_line ) LOOP IF cc > 0 THEN Disp_Text ( NULL, '*', '=' ); END IF; cc := cc + 1; Disp_Text ( NULL, LPAD('!', err_rec2.position, '~'), '=' ); Disp_Text ( NULL, err_rec2.text, '=' ); END LOOP; Disp_Text ( NULL, LPAD('!', 70, '-'), '=' ); END IF; END IF; END IF; END LOOP; DBMS_OUTPUT.PUT_LINE ( RPAD ('=', 77, '=') ); END Errors; END Show; / SHOW ERRORS DROP PUBLIC SYNONYM Show / CREATE PUBLIC SYNONYM Show FOR Show / GRANT EXECUTE ON Show TO PUBLIC;