Перенос PL/SQL в TimesTen и ttSrcScan


В версии 11g, TimesTen стал поддерживать PL/SQL, а точнее, движок PL/SQL Oracle Database 11g, был портирован в TimesTen, т.е., теперь, приложения, использующие PL/SQL могут работать и в TimesTen. Но, вы прекрасно понимаете, что TtimesTen не поддерживает ВСЕГО функционала Oracle Database, например нет триггеров, нельзя создавать типы (CREATE TYPE) и т.д. Кроме того, как показывает практика, приложения содержат огромное количество кода (сотни тысяч или миллионы строк) и анализ кода на проверку работоспособности в TimesTen может занять огромное количество времени, поэтому разработчики создали специальную утилиту (ttSrcScan), которая должна автоматизировать данный процесс.

Данная утилита доступна после установки TimesTen 11.2.1 в каталоге $TIMESTEN_HOME/quickstart/sample_util (правда нужно не забыть поставить quickstart), но если не хочется ставить лишнее программное обеспечение, то можно обратиться в Oracle и получить ее отдельно.

Итак, данная утилита принимает на вход директории в которых содержатся файлы с кодом и анализирует их, после чего выдает отчеты (HTML и текстовый) об обнаруженных ошибках. Очень удобная утилита, но, конечно существует ряд нюансов.
Например, попробуем создать пакет.

create or replace package test_1 as

  procedure p_test;

end test_1;
/
create or replace package body test_1 as

  procedure p_test
  is
     v_rec number (10);  
  begin
    for v_rec in ( select level from dual connect by level <=10 ) loop
      dbms_output.put_line ('1');
    end loop;
  end p_test;   
end test_1;
/
Т.е. я явно указываю SQL конструкцию, которую TimesTen не поддерживает.
Command> select level from dual connect by level <=10;
 1001: Syntax error in SQL statement before or at: "by", character position: 32
select level from dual connect by level <=10
                               ^^
The command failed.
Command>
Проверим данный пакет с помощью ttSrcScan.
[oracle@tt1 ~]$ cd /u01/app/oracle/product/11.2.1.8/TimesTen/tt2/quickstart/sample_util/
[oracle@tt1 sample_util]$ ./ttSrcScan -i /home/oracle/source -o /home/oracle/result


  ***************************************
  * Oracle TimesTen Source Code Scanner *
  ***************************************

  Options used:
  =============
  -input           = /home/oracle/source
  -output          = /home/oracle/result
  -nestedDir       = TRUE
  -version         = 11.2.1.8.0
  -summaryPrefix   = ttSrcScan
  -maxRows         = 15


  Summary Statistics:
  ===================

  Files Processed:
  Input files and sub-directories processed :         1
  Sub-directories processed                 :         0
  Unsupported file types                    :         0
  Files Scanned                             :         1

  Files Scanned:
  Scanned files with no source code issues  :         1
  Scanned files with source code issues     :         0

  Lines Of Code Scanned:
  Lines of code                             :        19
  Lines of code with issues                 :         0
  Percentage of lines of code with issues   :         0.00%


  Detail Statistics:
  ==================
  Summary Report           /home/oracle/result/ttSrcScan_summary.html
  Files Processed Report   /home/oracle/result/ttSrcScan_all_input_files.html
  Files With Issues Report /home/oracle/result/ttSrcScan_issue_files.html
  Log File                 /home/oracle/result/ttSrcScan_log_file.log


[oracle@tt1 sample_util]$
Следовательно, ошибок нет. Скомпилируем данный пакет в TimesTen.

Command> create or replace package test_1 as
       >
       >   procedure p_test;
       >
       > end test_1;
       > /

Package created.

Command> create or replace package body test_1 as
       >
       >   procedure p_test
       >   is
       >      v_rec number (10);
       >   begin
       >     for v_rec in ( select level from dual connect by level <=10 ) loop
       >       dbms_output.put_line ('1');
       >     end loop;
       >   end p_test;
       >
       > end test_1;
       > /

Package body created.


Что удивительно, здесь также ошибок нет и только при выполнении получаем

Command> exec test_1.p_test;
 1001: Syntax error in SQL statement before or at: "BY", character position: 32
SELECT LEVEL FROM DUAL CONNECT BY LEVEL <=10
                               ^^
 8507: ORA-06512: at "ORACLE.TEST_1", line 7
 8507: ORA-06512: at line 1
The command failed.
Command>
Следовательно, ошибки, связанные с неподдерживаемыми SQL операторами, получим только в runtime, это нужно учитывать. Кроме того, TimesTen поддерживает работу с некоторыми системными пакетыми (UTL_FILE, DBMS_LOCK и др.), полный список можно посмотреть в документации. Но, содержание пакетов может быть разным. Например:
Command> # TimesTen
Command> desc dbms_lock
       > ;

Package SYS.DBMS_LOCK:

  Procedure SLEEP:
    Arguments:
      SECONDS                         IN     NUMBER

1 PL/SQL object found.
и Oracle Database.
SQL> desc dbms_lock;

PROCEDURE ALLOCATE_UNIQUE

FUNCTION CONVERT RETURNS NUMBER(38)

FUNCTION CONVERT RETURNS NUMBER(38)

FUNCTION RELEASE RETURNS NUMBER(38)

FUNCTION RELEASE RETURNS NUMBER(38)

FUNCTION REQUEST RETURNS NUMBER(38)

FUNCTION REQUEST RETURNS NUMBER(38)

PROCEDURE SLEEP
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 SECONDS                        NUMBER                  IN

Поэтому, при анализе кода, ttSrcScan добавляет строки содержащие системные пакеты, как "потенциально ошибочные". Например, проанализируем данный код:
create or replace package test_1 as

  procedure p_test;

end test_1;
/
create or replace package body test_1 as

  procedure p_test
  is
  begin
    dbms_lock.sleep(10);
  end p_test;

end test_1;
/
[oracle@tt1 sample_util]$ ./ttSrcScan -i /home/oracle/source -o /home/oracle/result


  ***************************************
  * Oracle TimesTen Source Code Scanner *
  ***************************************

  Options used:
  =============
  -input           = /home/oracle/source
  -output          = /home/oracle/result
  -nestedDir       = TRUE
  -version         = 11.2.1.8.0
  -summaryPrefix   = ttSrcScan
  -maxRows         = 15


  Summary Statistics:
  ===================

  Files Processed:
  Input files and sub-directories processed :         1
  Sub-directories processed                 :         0
  Unsupported file types                    :         0
  Files Scanned                             :         1

  Files Scanned:
  Scanned files with no source code issues  :         0
  Scanned files with source code issues     :         1

  Lines Of Code Scanned:
  Lines of code                             :        16
  Lines of code with issues                 :         1
  Percentage of lines of code with issues   :         6.25%


  Detail Statistics:
  ==================
  Summary Report           /home/oracle/result/ttSrcScan_summary.html
  Files Processed Report   /home/oracle/result/ttSrcScan_all_input_files.html
  Files With Issues Report /home/oracle/result/ttSrcScan_issue_files.html
  Log File                 /home/oracle/result/ttSrcScan_log_file.log


[oracle@tt1 sample_util]$ 
 
А в файле test.sql__source_issues.html видим.


Собственно, нужно также быть очень осторожным при переносе системных пакетов.

Конечно, данная утилита имеет свои ограничения, но все же она позволяет очень быстро проверить основные конструкции кода. Игорь Мельников обещал написать (если будет время конечно :) ) свою утилиту ttChecker, аналогичную RacChecker.

Комментариев нет: