Visual Expert puede analizar el rendimiento de su código PL/SQL y generar algunas estadísticas sobre su ejecución. Esta funcionalidad se basa en los datos que generará e incluirá en su proyecto Visual Expert.
La forma de generar estos datos depende de su configuración:
CONNECT / AS SYSDB
CREATE OR REPLACE DIRECTORY PERFDATADIR AS 'C:\ODATA';
GRANT READ, WRITE ON DIRECTORY PERFDATADIR TO PERFTEST;
GRANT EXECUTE ON UTL_FILE TO PERFTEST;
GRANT SELECT ON v_$sql TO PERFTEST;
DECLARE
FILENAME NVARCHAR2(200);
DIRECTORY NVARCHAR2(200);
RECORDLIMIT NUMBER;
BEGIN
FILENAME := 'TestPerformanceData.veplsqlperf'; -- provide a filename. It must have the extension .veplsqlperf
DIRECTORY := 'PERFDATADIR'; -- provide the name of the Directory object created in step #2
RECORDLIMIT := NULL; -- provide a number to limit records or NULL to write all records
VEPERFUTILS.WRITEPERFORMANCEDATATOFILE(
FILENAME => FILENAME,
DIRECTORY => DIRECTORY,
RECORDLIMIT => RECORDLIMIT
);
--rollback;
END;
Una vez que el archivo de rendimiento esté listo después de seguir el proceso mencionado, puede ser utilizado por Visual Expert. Para ello, haga los siguientes pasos:





==================== Source of the file VEPerfUtils.PLSQL =========================
create or replace PACKAGE BODY VEPerfUtils AS
PROCEDURE WritePerformanceDataToFile(filename nvarchar2, directory nvarchar2, recordLimit number);
END;
/
create or replace PACKAGE BODY VEPerfUtils AS
PROCEDURE WritePerformanceDataToFile(filename nvarchar2, directory nvarchar2, recordLimit number)
IS
cursor vsql is
SELECT v.parsing_schema_name,v.EXECUTIONS, Round(v.elapsed_time / 1000, 3) as elapsed_time, v.sql_fulltext from
--PerfData
v$sql
v;
perfdata vsql%rowtype;
verecord CLOB;
vetemprecord CLOB;
veRecordCounter number := 0;
outputFileName nvarchar2(2000);
colum_delimiter nvarchar2(10) := N'«'||N'¬'||N'»';
row_delimiter nvarchar2(10) := N'«'||N'®'||N'»';
fileReference utl_file.file_type := NULL;
dataReadLength NUMBER := 2000;
startOffset NUMBER := 1;
dataLength NUMBER ;
dataBuffer NVARCHAR2(2000);
readCharsLen NUMBER := 0;
dataBufferLength NUMBER := 0;
BEGIN
verecord := NULL;
outputFileName := filename || '.veplsqlperf';
dbms_output.put_line('Opening :' || directory || outputFileName);
--open file
fileReference := utl_file.fopen_NCHAR(directory, outputFileName, 'a', 32760);
for perfdata in vsql loop
veRecordCounter := veRecordCounter + 1;
IF (recordLimit IS NOT NULL AND veRecordCounter > recordLimit) THEN
SYS.utl_file.fclose(fileReference);
dbms_output.put_line('total records written :'||veRecordCounter);
return;
END IF;
vetemprecord := nvl(perfdata.parsing_schema_name,'') || colum_delimiter
|| nvl(perfdata.EXECUTIONS, 0) || colum_delimiter
|| nvl(perfdata.elapsed_time, 0) || colum_delimiter
|| nvl(perfdata.sql_fulltext, '') || colum_delimiter
|| veRecordCounter
|| chr(10) || row_delimiter || chr(10);
verecord := verecord || vetemprecord;
IF (mod(veRecordCounter , 10) = 0) Then
startOffset := 1;
dataLength := nvl(dbms_lob.getlength(verecord), 0);
dataBuffer := '';
if(dataLength > 0) then
while (startOffset < dataLength)
loop
dataBuffer := '';
if ((dataReadLength + startOffset) > dataLength) then
readCharsLen := dataLength - startOffset + 1;
dbms_lob.READ(verecord, readCharsLen, startOffset, dataBuffer);
else
dbms_lob.READ(verecord, dataReadLength, startOffset, dataBuffer);
end if;
dataBufferLength := length(dataBuffer);
if(dataBufferLength > 0) then
utl_file.putF_NCHAR(fileReference, dataBuffer);
utl_file.fflush(fileReference);
end if;
startOffset := startOffset + dataReadLength;
END LOOP;
verecord := NULL;
end if;
End IF;
end loop;
startOffset := 1;
dataLength := nvl(dbms_lob.getlength(verecord), 0);
dataBuffer := '';
if(dataLength > 0) then
while (startOffset < dataLength)
loop
dataBuffer := '';
if ((dataReadLength + startOffset) > dataLength) then
readCharsLen := dataLength - startOffset + 1;
dbms_lob.READ(verecord, readCharsLen, startOffset, dataBuffer);
else
dbms_lob.READ(verecord, dataReadLength, startOffset, dataBuffer);
end if;
dataBufferLength := length(dataBuffer);
if(dataBufferLength > 0) then
utl_file.putF_NCHAR(fileReference, dataBuffer);
utl_file.fflush(fileReference);
end if;
startOffset := startOffset + dataReadLength;
END LOOP;
verecord := NULL;
end if;
dbms_output.put_line('Completed writing Total Records to file:' || veRecordCounter);
--close file
utl_file.fclose(fileReference);
EXCEPTION
WHEN OTHERS THEN
--close file
utl_file.fclose(fileReference);
dbms_output.put_line('ERROR_STACK: ' || DBMS_UTILITY.FORMAT_ERROR_STACK);
dbms_output.put_line('ERROR_BACKTRACE: ' || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
DBMS_OUTPUT.put_line ( 'Error raised in: '|| $$plsql_unit ||' at line ' || $$plsql_line || ' - '||sqlerrm);
dbms_output.put_line('Error Occurred');
END WritePerformanceDataToFile;
END VEPerfUtils;