|
Страница 4 из 4 SQL> create table t( x varchar2(4000) ); Table created.
SQL> create or replace 2 procedure maintain_t 3 ( p_str in varchar2 ) 4 as 5 begin 6 insert into t 7 ( x ) values 8 ( p_str ); 9 exception 10 when others 11 then 12 -- call some log_error() routine -- вызов некоторой подпрограммы протоколирования ошибок 13 null; 14 end; 15 / Procedure created. Она настолько проста, насколько это возможно. Ничего не должно работать неправильно, но для случаев, когда происходит ошибка, я протоколирую ее, используя написанную мною вспомогательную процедуру. Где-то она пишет хорошее сообщение об ошибке (будем надеяться!), а, случается, что кто бы не вызвал эту подпрограмму, он не будет иметь понятия, что произошла непредвиденная исключительная ситуация, поэтому она не может быть локализована. (Я постоянно встречаю подобный код.) Теперь, когда кто-то вызовет эту подпрограмму: SQL> exec maintain_t( rpad( 'x', 4001, 'x' ) ); PL/SQL procedure successfully completed. Ее выполнение кажется успешным, но это не так: SQL> select * from t; no rows selected Здесь и начинается неразбериха: пользователи "обрывают" телефон, пишут электронные письма, они говорят: "Сломался сервер Oracle Database, транзакция завершилась успешно, однако данные – некорректные". На самом деле, проблема заключается в скрытой ошибке. Теперь в среде сервера Oracle Database 11g для обнаружения таких ошибок я просто буду просить людей сначала выполнить над их кодом следующие действия: SQL> alter procedure maintain_t compile 2 PLSQL_Warnings = 'enable:all' 3 reuse settings 4 /
SP2-0805: Procedure altered with compilation warnings
SQL> show errors procedure maintain_t Errors for PROCEDURE MAINTAIN_T:
LINE/COL ERROR ---------- --------------------------------------- 9/8 PLW-06009: procedure "MAINTAIN_T" OTHERS handler does not end in RAISE or RAISE_APPLICATION_ERROR И тотчас же вы извлечете список приложений (и строки исходного кода), чтобы незамедлительно добавить простые вызовы RAISE, которые позволят увидеть, откуда поступает эта скрытая ошибка. Работа сделана. Пустячок, а приятно. . . Недаром говорят – пустячок, а приятно. Есть у меня напоследок одна мелочь, которая немного упрощает вашу программистскую жизнь, а язык PL/SQL делает немного более совершенным: SQL> create sequence this_is_nice; Sequence created.
SQL> declare 2 n number; 3 begin 4 n := this_is_nice.nextval; 5 dbms_output.put_line( n ); 6 end; 7 / 1 PL/SQL procedure successfully completed. Сравните это с тем, как такое нужно было делать в сервере Oracle Database 10g и предыдущих версиях. В сервере Oracle Database 11g не нужно больше выбирать последовательность из таблицы DUAL. Так что, язык PL/SQL стал намного более совершенным.
|