powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / поиск ошибок
13 сообщений из 13, страница 1 из 1
поиск ошибок
    #39693345
celestial
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, уважаемые коллеги.

часто при написании кода вижу такое
авторWarning: Procedure created with compilation errors.

можно ли как то включить более подробное описание ошибки?
Чтоб хоть как то понимать в чем причина.
Иначе напоминает поведение windows, что-то не работает, а что именно - не указывается.
...
Рейтинг: 0 / 0
поиск ошибок
    #39693349
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Connected to Oracle Database 11g Release 11.2.0.1.0 
Connected as big3@DM

SQL> create procedure test1 as
  2  i number;
  3  begin
  4    i = 1;
  5  end;
  6  /

Warning: Procedure created with compilation errors

SQL> show errors;
Errors for PROCEDURE BIG3.TEST1:
LINE/COL ERROR
-------- -----------------------------------------------------------------------------------------------------------------------------------------------------
4/5      PLS-00103: Встретился символ "=" в то время как ожидалось одно из следующих:       := . ( @ % ;  Символ ":= был вставлен перед "=" для продолжения.  

SQL> 


Лучше, конечно, использовать более продвинутое средство разработки, чем sqlplus.
...
Рейтинг: 0 / 0
поиск ошибок
    #39693350
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RTFM https://docs.oracle.com/cd/E11882_01/server.112/e16604/ch_twelve041.htm#sthref2264]SHO[W] ERR[ORS] (FAQ)
...
Рейтинг: 0 / 0
поиск ошибок
    #39693351
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dmdmdmЛучше, конечно, использовать более продвинутое средство разработки, чем sqlplus.Какой быдло-гуй?
...
Рейтинг: 0 / 0
поиск ошибок
    #39693353
celestial
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем!
и спасибо за лояльность к избитым вопросам.

Elic, согласен, Oracle SQL Developer выводит осмысленные ошибки, но как то не сложилось у меня с гуями.
привычка работать в command line.
...
Рейтинг: 0 / 0
поиск ошибок
    #39693354
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Небожители пользуют исключительно svn/vim/sqlplus.
...
Рейтинг: 0 / 0
поиск ошибок
    #39693372
celestial
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изначально хотел разобраться почему не соответствует количество открытых и закрытых IF/END IF
обратите внимание на скрин из книги (см. вложение)
перенёс код.

Если рассматривать конструкцию с первого IF и последнего END IF, и далее рассматривать вложенные IF/END IF
то получается следующее.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
        IF (sales_cur%FOUND)                                                     -- начало первого IF
        THEN
            IF (current_person != next_person)                                   -- начало второго IF
            THEN
                IF (current_person != ' ')                                       -- начало третьего IF
                THEN
                    dbms_output.put_line (current_person  ||
                                         ' ' ||
                                         total_sale ||
                                         ' ' ||
                                         total_sale * commission_rate / 100);
                END IF;                                                          -- а это к чему относится?
                total_sale := quantity_sold * item_price;
                current_person := next_person;
            END IF;                                                              -- конец третьего IF
            ELSE IF (current_person != ' ')
            THEN
                dbms_output.put_line(current_person ||
                                    ' ' ||
                                    total_sale ||
                                    ' ' ||
                                    total_sale * commission_rate / 100);
            END IF;                                                              -- конец второго IF
        END IF;                                                                  -- конец первого IF  


Если рассматривать вложенные начиная с самого "глубокого"
то получается вот так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
        IF (sales_cur%FOUND)-----------------------------------------------------------------------|
        THEN                                                                                     --|
            IF (current_person != next_person)---------------------------------------------|     --|
            THEN                                                                         --|     --|
                IF (current_person != ' ')-----------------------------------------|     --|     --|
                THEN                                                             --|     --|     --|
                    dbms_output.put_line (current_person  ||                     --|     --|     --|
                                         ' ' ||                                  --|     --|     --|
                                         total_sale ||                           --|     --|     --|
                                         ' ' ||                                  --|     --|     --|
                                         total_sale * commission_rate / 100);    --|     --|     --|
                END IF;------------------------------------------------------------|     --|     --|
                total_sale := quantity_sold * item_price;                                --|     --|
                current_person := next_person;                                           --|     --|
            END IF;------------------------------------------------------------------------|     --|
            ELSE IF (current_person != ' ')                                                      --|
            THEN                                                                                 --|
                dbms_output.put_line(current_person ||                                           --|
                                    ' ' ||                                                       --|
                                    total_sale ||                                                --|
                                    ' ' ||                                                       --|
                                    total_sale * commission_rate / 100);                         --|
            END IF;  ------------------------------------------------------------------------------
        END IF;       --<-- вот это тогда к чему относится?



и это работает.
Но почему так?
...
Рейтинг: 0 / 0
поиск ошибок
    #39693378
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
SQL> declare
  2    i number := 6;
  3  begin
  4          IF (i = 1)
  5          THEN
  6              IF (i = 2)
  7              THEN
  8                  IF (i = 3)
  9                  THEN
 10                      dbms_output.put_line (i);
 11                  END IF;
 12                  i := 5;
 13              END IF;
 14          ELSE IF (i = 6)
 15              THEN
 16                  dbms_output.put_line(i);
 17              END IF;
 18          END IF;
 19  end;
 20  /

6
PL/SQL procedure successfully completed

SQL> 
...
Рейтинг: 0 / 0
поиск ошибок
    #39693393
celestial
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dmdmdm,

то есть получается, если используем конструкцию
Код: plsql
1.
2.
3.
4.
5.
6.
IF
THEN
    ELSE IF;
    THEN;
    END IF;
END IF;


То нужно явно закрывать условие ELSE IF, то есть дополнительный END IF ставить надо.

брр. чуть с ума не сошел.
В других языках проще.


Код: perl
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
sergey@sergey-virtual-machine:~$ cat test.pl
#!/usr/bin/perl

use strict;
use warnings;

my $i = 6;

if ($i == 1){
    print "i = $i";
} elsif ($i == 6){
    print "i = $i\n";
}

sergey@sergey-virtual-machine:~$ ./test.pl 
i = 6
sergey@sergey-virtual-machine:~$



Наткнулся на специфику оракла.
...
Рейтинг: 0 / 0
поиск ошибок
    #39693396
celestial
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dmdmdm,

Тогда легче так
без лишнего
END IF
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
SQL> DECLARE
  2      i NUMBER := 6;
  3  BEGIN
  4  IF (i = 1)
  5  THEN
  6      IF (i = 2)
  7      THEN
  8          IF (i = 3)
  9          THEN
 10              dbms_output.put_line (i);
 11          END IF;
 12          i := 5;
 13      END IF;
 14  ELSIF (i = 6)
 15  THEN
 16          dbms_output.put_line(i);
 17  END IF;
 18  END;
 19  /
6

PL/SQL procedure successfully completed.

SQL>


в данном случае (в данной логике конструкции) это логичнее.
...
Рейтинг: 0 / 0
поиск ошибок
    #39693430
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
celestialНаткнулся на специфику оракла.Что в оракле, что в си, elsif часть if. А else if часть одного и начало следующего.
...
Рейтинг: 0 / 0
поиск ошибок
    #39693440
Synoptic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
celestial, в "других", это в каких?
...
Рейтинг: 0 / 0
поиск ошибок
    #39693443
celestial
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-2-,

Точно. Уже после долетело
ELSE IF != ELSIF
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / поиск ошибок
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]