powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помогите исправить ошибку ORA-06550: line 16, column 51: PLS-00103: Encountered the symbol
4 сообщений из 4, страница 1 из 1
Помогите исправить ошибку ORA-06550: line 16, column 51: PLS-00103: Encountered the symbol
    #40084521
GodExecutive
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемые форумчане,
помогите исправить ошибку.

Есть код, который тестирую в http://sqlfiddle.com/

Код: 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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
CREATE TYPE O_SALE AS OBJECT
(  SALE_MONTH INTEGER,
  SALE_AMOUNT NUMBER);/
 
CREATE TYPE T_SALE AS TABLE OF O_SALE;/
 
CREATE OR REPLACE FUNCTION "GET_SALES_MONTH" (I_MONTH_NUMBER IN INTEGER)
  RETURN T_SALE
  PIPELINED AS
   L_O_SALE O_SALE := NULL;
  L_T_SALE T_SALE := T_SALE();
 
BEGIN
 
  FOR I IN (SELECT S.SALE_AMOUNT,
                   S.SALE_DATE,
                   EXTRACT(MONTH FROM S.SALE_DATE) AS DATE_MONTH_7,
                   EXTRACT(MONTH FROM S.SALE_DATE - 1) AS DATE_MONTH_1, 
                   EXTRACT(MONTH FROM S.SALE_DATE - 4) AS DATE_MONTH_4, 
                   EXTRACT(MONTH FROM S.SALE_DATE - 5) AS DATE_MONTH_5, 
                   EXTRACT(MONTH FROM S.SALE_DATE - 6) AS DATE_MONTH_6, 
                   S.SALE_AMOUNT / 5 AS AMOUNT_DAY
              FROM SALE S) LOOP
   
    L_O_SALE := O_SALE(SALE_MONTH  => I.DATE_MONTH_1,
                       SALE_AMOUNT => I.AMOUNT_DAY);
   
    L_T_SALE.EXTEND;
    L_T_SALE(L_T_SALE.COUNT) := L_O_SALE;
   
    L_O_SALE := O_SALE(SALE_MONTH  => I.DATE_MONTH_4,
                       SALE_AMOUNT => I.AMOUNT_DAY);
   
    L_T_SALE.EXTEND;
    L_T_SALE(L_T_SALE.COUNT) := L_O_SALE;
   
    L_O_SALE := O_SALE(SALE_MONTH  => I.DATE_MONTH_5,
                       SALE_AMOUNT => I.AMOUNT_DAY);
   
    L_T_SALE.EXTEND;
    L_T_SALE(L_T_SALE.COUNT) := L_O_SALE;
   
    L_O_SALE := O_SALE(SALE_MONTH  => I.DATE_MONTH_6,
                       SALE_AMOUNT => I.AMOUNT_DAY);
   
    L_T_SALE.EXTEND;
    L_T_SALE(L_T_SALE.COUNT) := L_O_SALE;
   
    L_O_SALE := O_SALE(SALE_MONTH  => I.DATE_MONTH_7,
                       SALE_AMOUNT => I.AMOUNT_DAY);
   
    L_T_SALE.EXTEND;
    L_T_SALE(L_T_SALE.COUNT) := L_O_SALE;
   
  END LOOP;
 
  FOR T IN (SELECT SUM(S.SALE_AMOUNT) AS SUM_SALE_AMOUNT, S.SALE_MONTH
              FROM (TABLE(L_T_SALE)) S
             WHERE S.SALE_MONTH = NVL(I_MONTH_NUMBER, S.SALE_MONTH)
             GROUP BY S.SALE_MONTH) LOOP
   
    L_O_SALE := O_SALE(SALE_MONTH  => T.SALE_MONTH,
                       SALE_AMOUNT => T.SUM_SALE_AMOUNT);
   
    L_T_SALE.EXTEND;
    L_T_SALE(L_T_SALE.COUNT) := L_O_SALE;
   
    PIPE ROW(L_O_SALE);
     END LOOP;
   RETURN;
 END GET_SALES_MONTH;



Ругается на строчку " EXTRACT(MONTH FROM S.SALE_DATE - 6) AS DATE_MONTH_6, "
Но почему именно на неё не понятно. Она такая же как предыдущие
...
Рейтинг: 0 / 0
Помогите исправить ошибку ORA-06550: line 16, column 51: PLS-00103: Encountered the symbol
    #40084523
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скорее всего затесался непечатный символ. У меня в SQL*Plus полет нормальный:

Код: 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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
SQL> CREATE TABLE SALE AS SELECT SAL SALE_AMOUNT,HIREDATE SALE_DATE FROM EMP
  2  /

Table created.

SQL> CREATE TYPE O_SALE AS OBJECT
  2  ( SALE_MONTH INTEGER,
  3  SALE_AMOUNT NUMBER);
  4  /

Type created.

SQL> CREATE TYPE T_SALE AS TABLE OF O_SALE;
  2  /

Type created.

SQL> CREATE OR REPLACE FUNCTION "GET_SALES_MONTH" (I_MONTH_NUMBER IN INTEGER)
  2  RETURN T_SALE
  3  PIPELINED AS
  4  L_O_SALE O_SALE := NULL;
  5  L_T_SALE T_SALE := T_SALE();
  6
  7  BEGIN
  8
  9  FOR I IN (SELECT S.SALE_AMOUNT,
 10  S.SALE_DATE,
 11  EXTRACT(MONTH FROM S.SALE_DATE) AS DATE_MONTH_7,
 12  EXTRACT(MONTH FROM S.SALE_DATE - 1) AS DATE_MONTH_1,
 13  EXTRACT(MONTH FROM S.SALE_DATE - 4) AS DATE_MONTH_4,
 14  EXTRACT(MONTH FROM S.SALE_DATE - 5) AS DATE_MONTH_5,
 15  EXTRACT(MONTH FROM S.SALE_DATE - 6) AS DATE_MONTH_6,
 16  S.SALE_AMOUNT / 5 AS AMOUNT_DAY
 17  FROM SALE S) LOOP
 18
 19  L_O_SALE := O_SALE(SALE_MONTH => I.DATE_MONTH_1,
 20  SALE_AMOUNT => I.AMOUNT_DAY);
 21
 22  L_T_SALE.EXTEND;
 23  L_T_SALE(L_T_SALE.COUNT) := L_O_SALE;
 24
 25  L_O_SALE := O_SALE(SALE_MONTH => I.DATE_MONTH_4,
 26  SALE_AMOUNT => I.AMOUNT_DAY);
 27
 28  L_T_SALE.EXTEND;
 29  L_T_SALE(L_T_SALE.COUNT) := L_O_SALE;
 30
 31  L_O_SALE := O_SALE(SALE_MONTH => I.DATE_MONTH_5,
 32  SALE_AMOUNT => I.AMOUNT_DAY);
 33
 34  L_T_SALE.EXTEND;
 35  L_T_SALE(L_T_SALE.COUNT) := L_O_SALE;
 36
 37  L_O_SALE := O_SALE(SALE_MONTH => I.DATE_MONTH_6,
 38  SALE_AMOUNT => I.AMOUNT_DAY);
 39
 40  L_T_SALE.EXTEND;
 41  L_T_SALE(L_T_SALE.COUNT) := L_O_SALE;
 42
 43  L_O_SALE := O_SALE(SALE_MONTH => I.DATE_MONTH_7,
 44  SALE_AMOUNT => I.AMOUNT_DAY);
 45
 46  L_T_SALE.EXTEND;
 47  L_T_SALE(L_T_SALE.COUNT) := L_O_SALE;
 48
 49  END LOOP;
 50
 51  FOR T IN (SELECT SUM(S.SALE_AMOUNT) AS SUM_SALE_AMOUNT, S.SALE_MONTH
 52  FROM (TABLE(L_T_SALE)) S
 53  WHERE S.SALE_MONTH = NVL(I_MONTH_NUMBER, S.SALE_MONTH)
 54  GROUP BY S.SALE_MONTH) LOOP
 55
 56  L_O_SALE := O_SALE(SALE_MONTH => T.SALE_MONTH,
 57  SALE_AMOUNT => T.SUM_SALE_AMOUNT);
 58
 59  L_T_SALE.EXTEND;
 60  L_T_SALE(L_T_SALE.COUNT) := L_O_SALE;
 61
 62  PIPE ROW(L_O_SALE);
 63  END LOOP;
 64  RETURN;
 65  END GET_SALES_MONTH;
 66  /

Function created.

SQL>



SY.
...
Рейтинг: 0 / 0
Помогите исправить ошибку ORA-06550: line 16, column 51: PLS-00103: Encountered the symbol
    #40084524
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
GodExecutive,

там есть проблемы с парсингом: во-первых, слеш должен стоять в отдельной новой строчке, а не как у тебя тут:
GodExecutive
Код: plsql
1.
2.
3.
CREATE TYPE O_SALE AS OBJECT
(  SALE_MONTH INTEGER,
  SALE_AMOUNT NUMBER);/


во-вторых, чтобы нормально sqlfiddle работал поменяй снизу в настройках Query terminator со слеша на двойной слеш и в своем коде поменяй слеш на двойной слеш: http://sqlfiddle.com/#!4/8c10a


Код: 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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
CREATE TABLE SALE AS SELECT 10 SALE_AMOUNT,sysdate SALE_DATE FROM dual
//
CREATE TYPE O_SALE AS OBJECT(
  SALE_MONTH INTEGER,
  SALE_AMOUNT NUMBER);
//
CREATE TYPE T_SALE AS TABLE OF O_SALE;
//
CREATE OR REPLACE FUNCTION "GET_SALES_MONTH" (I_MONTH_NUMBER IN INTEGER)
  RETURN T_SALE
  PIPELINED AS
  L_O_SALE O_SALE := NULL;
  L_T_SALE T_SALE := T_SALE();
BEGIN
  FOR I IN (SELECT S.SALE_AMOUNT,
                   S.SALE_DATE,
                   EXTRACT(MONTH FROM S.SALE_DATE) AS DATE_MONTH_7,
                   EXTRACT(MONTH FROM S.SALE_DATE - 1) AS DATE_MONTH_1, 
                   EXTRACT(MONTH FROM S.SALE_DATE - 4) AS DATE_MONTH_4, 
                   EXTRACT(MONTH FROM S.SALE_DATE - 5) AS DATE_MONTH_5, 
                   EXTRACT(MONTH FROM S.SALE_DATE - 6) AS DATE_MONTH_6, 
                   S.SALE_AMOUNT / 5 AS AMOUNT_DAY
              FROM SALE S)
    LOOP
    L_O_SALE := O_SALE(SALE_MONTH  => I.DATE_MONTH_1,
                       SALE_AMOUNT => I.AMOUNT_DAY);
   
    L_T_SALE.EXTEND;
    L_T_SALE(L_T_SALE.COUNT) := L_O_SALE;
   
    L_O_SALE := O_SALE(SALE_MONTH  => I.DATE_MONTH_4,
                       SALE_AMOUNT => I.AMOUNT_DAY);
   
    L_T_SALE.EXTEND;
    L_T_SALE(L_T_SALE.COUNT) := L_O_SALE;
   
    L_O_SALE := O_SALE(SALE_MONTH  => I.DATE_MONTH_5,
                       SALE_AMOUNT => I.AMOUNT_DAY);
   
    L_T_SALE.EXTEND;
    L_T_SALE(L_T_SALE.COUNT) := L_O_SALE;
   
    L_O_SALE := O_SALE(SALE_MONTH  => I.DATE_MONTH_6,
                       SALE_AMOUNT => I.AMOUNT_DAY);
   
    L_T_SALE.EXTEND;
    L_T_SALE(L_T_SALE.COUNT) := L_O_SALE;
   
    L_O_SALE := O_SALE(SALE_MONTH  => I.DATE_MONTH_7,
                       SALE_AMOUNT => I.AMOUNT_DAY);
   
    L_T_SALE.EXTEND;
    L_T_SALE(L_T_SALE.COUNT) := L_O_SALE;
   
  END LOOP;
 
  FOR T IN (SELECT SUM(S.SALE_AMOUNT) AS SUM_SALE_AMOUNT, S.SALE_MONTH
              FROM (TABLE(L_T_SALE)) S
             WHERE S.SALE_MONTH = NVL(I_MONTH_NUMBER, S.SALE_MONTH)
             GROUP BY S.SALE_MONTH) LOOP
   
    L_O_SALE := O_SALE(SALE_MONTH  => T.SALE_MONTH,
                       SALE_AMOUNT => T.SUM_SALE_AMOUNT);
   
    L_T_SALE.EXTEND;
    L_T_SALE(L_T_SALE.COUNT) := L_O_SALE;
   
    PIPE ROW(L_O_SALE);
     END LOOP;
   RETURN;
 END GET_SALES_MONTH;
//



а вообще лучше DBFiddle использовать: https://dbfiddle.uk/
...
Рейтинг: 0 / 0
Помогите исправить ошибку ORA-06550: line 16, column 51: PLS-00103: Encountered the symbol
    #40084525
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
или livesql.oracle.com
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помогите исправить ошибку ORA-06550: line 16, column 51: PLS-00103: Encountered the symbol
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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