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

Есть код, который тестирую в 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
18.07.2021, 15:44
    #40084523
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите исправить ошибку ORA-06550: line 16, column 51: PLS-00103: Encountered the symbol
Скорее всего затесался непечатный символ. У меня в 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
18.07.2021, 16:17
    #40084524
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите исправить ошибку ORA-06550: line 16, column 51: PLS-00103: Encountered the symbol
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
18.07.2021, 16:18
    #40084525
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите исправить ошибку ORA-06550: line 16, column 51: PLS-00103: Encountered the symbol
или livesql.oracle.com
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помогите исправить ошибку ORA-06550: line 16, column 51: PLS-00103: Encountered the symbol / 4 сообщений из 4, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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