powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / ROWNUM и данные
19 сообщений из 19, страница 1 из 1
ROWNUM и данные
    #40022181
LiQuid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем добрый день.

Пишу вот такой код:

Код: plsql
1.
2.
3.
SELECT PRACTICE, count(*) AS maximum FROM COURSE_SELECTIONS WHERE PRACTICE IS NOT NULL 
	GROUP BY PRACTICE 
	ORDER BY MAXIMUM DESC 



Выводит данные:

Код: plsql
1.
2.
3.
4.
19663	1061
20112	663
18286	651
8177	        606



Пишу так:
Код: plsql
1.
2.
3.
SELECT PRACTICE, count(*) AS maximum FROM COURSE_SELECTIONS WHERE PRACTICE IS NOT NULL AND ROWNUM  = 1 
	GROUP BY PRACTICE 
	ORDER BY MAXIMUM DESC 



Должен был вывести:

19663 1061

Вместо этого вывел
5840 1

Хотел использовать как LIMIT 1 - MySQL или TOP 1 в MS SQL Server.
Где ошибка?
...
Рейтинг: 0 / 0
ROWNUM и данные
    #40022186
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiQuid,

ROWNUM до сортировки
Код: plsql
1.
2.
3.
4.
5.
6.
select * from (
 SELECT PRACTICE, count(*) AS maximum FROM COURSE_SELECTIONS WHERE PRACTICE IS NOT NULL 
	GROUP BY PRACTICE
	ORDER BY MAXIMUM DESC 
 ) s
where ROWNUM  = 1 



.....
stax
...
Рейтинг: 0 / 0
ROWNUM и данные
    #40022189
LiQuid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо.
...
Рейтинг: 0 / 0
ROWNUM и данные
    #40022194
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LiQuid,

Ищите на странице
Select
row_limiting_clause и Row Limiting: Examples
...
Рейтинг: 0 / 0
ROWNUM и данные
    #40022263
LiQuid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите еще один раз:

Есть код:
Код: 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.
CREATE OR REPLACE PROCEDURE SYSTEM.getMostPopularCouseForSemesterProc(
	year INT, 
	term INT
	)

AS
	ders_kod VARCHAR(50);
	practice NUMBER(20);
	max_count NUMBER(20);

CURSOR cur IS (SELECT * FROM (
 SELECT count(*) AS maximum, DERS_KOD, PRACTICE FROM 
 	COURSE_SELECTIONS WHERE PRACTICE IS NOT NULL AND course_selections.year = year AND course_selections.term = term
	GROUP BY DERS_KOD, PRACTICE
	ORDER BY MAXIMUM DESC 
 ) s
where ROWNUM = 1);

BEGIN
    OPEN cur;    -- Открываем курсор
    LOOP FETCH cur  -- Извлекаем записи из курсора
    INTO  max_count,
          ders_kod,
          practice;
    EXIT WHEN cur%NOTFOUND;
    
    	DBMS_OUTPUT.PUT_LINE('MAX = ' || max_count || '  MOST POPULAR COURSE: COURSE CODE = ' || ders_kod || '   PRACTICE = ' || practice);

    END LOOP;
    CLOSE cur;
END;



Вызываю процедуру:
Код: plsql
1.
2.
3.
begin
    getMostPopularCouseForSemesterProc(2, 2016);
end;



Возвращает
MAX = 1061 MOST POPULAR COURSE: COURSE CODE = TUR 102 PRACTICE = 19663

Если запустить с явным указанием значении year, term как показано в коде ниже, то возвращает другие значения. Почему?
Ведь нет разницы, явно я указал в Select-е значение переменных или передал через параметр процедуры?

Вот явно передаю year =2016, term=2
Код: 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.
CREATE OR REPLACE PROCEDURE SYSTEM.getMostPopularCouseForSemesterProc(
	year INT, 
	term INT
	)

AS
	ders_kod VARCHAR(50);
	practice NUMBER(20);
	max_count NUMBER(20);

CURSOR cur IS (SELECT * FROM (
 SELECT count(*) AS maximum, DERS_KOD, PRACTICE FROM 
 	COURSE_SELECTIONS WHERE PRACTICE IS NOT NULL AND course_selections.year = 2016 AND course_selections.term = 2
	GROUP BY DERS_KOD, PRACTICE
	ORDER BY MAXIMUM DESC 
 ) s
where ROWNUM = 1);

BEGIN
    OPEN cur;    -- Открываем курсор
    LOOP FETCH cur  -- Извлекаем записи из курсора
    INTO  max_count,
          ders_kod,
          practice;
    EXIT WHEN cur%NOTFOUND;
    
    	DBMS_OUTPUT.PUT_LINE('MAX = ' || max_count || '  MOST POPULAR COURSE: COURSE CODE = ' || ders_kod || '   PRACTICE = ' || practice);

    END LOOP;
    CLOSE cur;
END;


При вызове возвращает:

MAX = 606 MOST POPULAR COURSE: COURSE CODE = HSS 196 PRACTICE = 8177

Не понял.
...
Рейтинг: 0 / 0
ROWNUM и данные
    #40022268
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiQuid
Ведь нет разницы, явно я указал в Select-е значение переменных или передал через параметр процедуры?
RTFM PL/SQL Name Resolution: Column Name Precedence
...
Рейтинг: 0 / 0
ROWNUM и данные
    #40022270
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LiQuid,

Код: plsql
1.
2.
	p_year INT, 
	p_term INT
...
Рейтинг: 0 / 0
ROWNUM и данные
    #40022344
LiQuid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо.

Как правильно вставлять переменные в TYPE для функции, возвращающей тип TYPE?

Создаю TYPE
Код: plsql
1.
2.
3.
4.
5.
CREATE OR REPLACE TYPE course_type AS OBJECT (
    m_count NUMBER,
	course_code VARCHAR(20),
	prac_teacher NUMBER
);



Пытаюсь написать фунцию:
Код: 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.
CREATE OR REPLACE FUNCTION getPopularCourse( 
	p_term INT,
    p_year INT
	) RETURN course_type

AS
	ders_kod VARCHAR(50);
	practice NUMBER(20);
	max_count NUMBER(20);
	
	c_type course_type;

CURSOR cur IS (SELECT s.maximum, s.DERS_KOD, s.PRACTICE INTO c_type FROM (
 SELECT count(*) AS maximum, DERS_KOD, PRACTICE FROM 
 	COURSE_SELECTIONS WHERE PRACTICE IS NOT NULL AND YEAR = p_year AND TERM = p_term
	GROUP BY DERS_KOD, PRACTICE
	ORDER BY MAXIMUM DESC 
 ) s
where ROWNUM = 1);

BEGIN
    OPEN cur;    -- Открываем курсор
    LOOP FETCH cur  -- Извлекаем записи из курсора
    INTO  max_count,
          ders_kod,
          practice;
    EXIT WHEN cur%NOTFOUND;

    	DBMS_OUTPUT.PUT_LINE('MAX = ' || max_count || '  MOST POPULAR COURSE CODE = ' || ders_kod || '   PRACTICE = ' || practice);

    END LOOP;
    CLOSE cur;
   RETURN(c_type);
END;


Отваливает с ошибкой:
Error report -
ORA-06550: Строка 4, столбец 54:
PL/SQL: ORA-00947: не хватает значений для данных
ORA-06550: Строка 4, столбец 1:
PL/SQL: SQL Statement ignored
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:
...
Рейтинг: 0 / 0
ROWNUM и данные
    #40022346
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
CURSOR cur IS ( SELECT



Лишняя скобка.
...
Рейтинг: 0 / 0
ROWNUM и данные
    #40022349
LiQuid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Убрал лишнюю скобку, пишет:

Function GETPOPULARCOURSE compiled

LINE/COL ERROR
--------- -------------------------------------------------------------
13/15 PL/SQL: SQL Statement ignored
13/68 PL/SQL: ORA-00947: не хватает значений для данных
Errors: check compiler log

Не понятно каких значении?
...
Рейтинг: 0 / 0
ROWNUM и данные
    #40022350
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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 
Connected as system@ORCL

SQL> 
SQL> CREATE OR REPLACE TYPE course_type AS OBJECT (
  2      m_count NUMBER,
  3    course_code VARCHAR(20),
  4    prac_teacher NUMBER
  5  );
  6  /

Type created



SQL> 
SQL> CREATE OR REPLACE FUNCTION getPopularCourse RETURN course_type AS
  2    c_type course_type;
  3  BEGIN
  4  
  5    SELECT maximum, DERS_KOD, PRACTICE INTO c_type.m_count, c_type.course_code, c_type.prac_teacher FROM (
  6      select 1 maximum, '2qwe' ders_kod, 1 practice from dual
  7    );
  8    RETURN(c_type);
  9  exception when NO_DATA_FOUND then
 10    DBMS_OUTPUT.PUT_LINE('oops');
 11    return NULL;
 12  END;
 13  /

Function created


SQL> set SERVEROUTPUT ON
SQL> select getPopularCourse from dual;
select getPopularCourse from dual

ORA-06530: Reference to uninitialized composite
ORA-06512: at "SYSTEM.GETPOPULARCOURSE", line 5




Дальше сами.
...
Рейтинг: 0 / 0
ROWNUM и данные
    #40022353
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dmdmdm
Дальше сами.
ТС, конечно, не сахар, но помощь даже не медвежья.
...
Рейтинг: 0 / 0
ROWNUM и данные
    #40022358
LiQuid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообщем функция на консоль выводит данные, но при вызове функции возвращает пустое значение:

Код: 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.
CREATE OR REPLACE FUNCTION getPopularCourse( 
	p_term INT,
    p_year INT
	) RETURN course_type AS c_type course_type;

	max_count NUMBER(20);
	d_kod VARCHAR(50);
	prac NUMBER(20);

    CURSOR cur IS SELECT maximum, DERS_KOD, PRACTICE INTO c_type.m_count, c_type.course_code, c_type.prac_teacher FROM (
        SELECT count(*) AS maximum, DERS_KOD, PRACTICE FROM 
        COURSE_SELECTIONS WHERE PRACTICE IS NOT NULL AND YEAR = p_year AND TERM = p_term
        GROUP BY DERS_KOD, PRACTICE
        ORDER BY maximum DESC 
 ) s
    where ROWNUM = 1;

BEGIN
    OPEN cur;    -- Открываем курсор
        LOOP FETCH cur INTO  
            max_count,
            d_kod,
            prac;
        EXIT WHEN cur%NOTFOUND;

    	DBMS_OUTPUT.PUT_LINE('MAX = ' || max_count || '  MOST POPULAR COURSE CODE = ' || d_kod || '   PRACTICE = ' || prac);

        END LOOP;
   CLOSE cur;
   RETURN(c_type);
END;



На консоль:
PL/SQL procedure successfully completed.

MAX = 150 MOST POPULAR COURSE CODE = RUS 101 PRACTICE = 4999

При вызове самой функции:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
set SERVEROUTPUT ON
DECLARE
c_t course_type;
BEGIN
    c_t := getPopularCourse(1, 2016);
    DBMS_OUTPUT.put_line('MAX: ' || c_t.m_count || ' COURSE CODE: ' || c_t.course_code || ' PRACTICE: ' || c_t.prac_teacher);
END;



Выход:
MAX: COURSE CODE: PRACTICE:
т.е по сути в теле функции курсор видит запись и вывела на консоль, но при вызове функции извне, вернула пустое значение.
...
Рейтинг: 0 / 0
ROWNUM и данные
    #40022360
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiQuid

Не понятно каких значении?

Код: 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.
  1  declare
  2  c_popular course_type;
  3  FUNCTION getPopularCourse(
  4      p_term INT,
  5      p_year INT
  6     ) RETURN course_type
  7  AS
  8   c_type course_type :=course_type(null,null,null);
  9   CURSOR cur IS (SELECT s.maximum, s.DERS_KOD, s.PRACTICE FROM ( --into не надо
 10   SELECT count(*) AS maximum, job DERS_KOD, deptno PRACTICE FROM
 11     emp WHERE comm IS NOT NULL --AND YEAR = p_year AND TERM = p_term
 12     GROUP BY job, deptno
 13     ORDER BY MAXIMUM DESC
 14   ) s
 15  where ROWNUM = 1);
 16  BEGIN
 17      OPEN cur;    -- Открываем курсор
 18      LOOP FETCH cur  -- Извлекаем записи из курсора
 19      INTO  c_type.m_count,
 20            c_type.course_code,
 21            c_type.prac_teacher;
 22      EXIT WHEN cur%NOTFOUND;
 23             DBMS_OUTPUT.PUT_LINE('MAX = ' || c_type.m_count || '  MOST POPULAR COURSE CODE = ' || c_type.course_code || '   PRACTICE = ' || c_type.prac_teacher);
 24      END LOOP;
 25      CLOSE cur;
 26     RETURN(c_type);
 27  END;
 28  begin
 29   c_popular:=getPopularCourse(1,2);
 30* end;
SQL> /
MAX = 3  MOST POPULAR COURSE CODE = SALESMAN   PRACTICE = 30

PL/SQL procedure successfully completed.

SQL>



.....
stax
...
Рейтинг: 0 / 0
ROWNUM и данные
    #40022366
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiQuid

т.е по сути в теле функции курсор видит запись и вывела на консоль, но при вызове функции извне, вернула пустое значение.


профетчили в INTO max_count, d_kod, prac;
a RETURN(c_type);


ps
c_type:=course_type(max_count, d_kod, prac);
.....
stax
...
Рейтинг: 0 / 0
ROWNUM и данные
    #40022406
LiQuid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо большое. Работает.

Код: 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.
CREATE OR REPLACE TYPE course_type AS OBJECT (
    m_count NUMBER,
	course_code VARCHAR(20),
	prac_teacher NUMBER
);

CREATE OR REPLACE FUNCTION getPopularCourse( 
	p_term INT,
    p_year INT
	) RETURN course_type AS c_type course_type;

	max_count NUMBER(20);
	d_kod VARCHAR(50);
	prac NUMBER(20);

    CURSOR cur IS SELECT maximum, DERS_KOD, PRACTICE FROM (
        SELECT count(*) AS maximum, DERS_KOD, PRACTICE FROM 
        COURSE_SELECTIONS WHERE PRACTICE IS NOT NULL AND YEAR = p_year AND TERM = p_term
        GROUP BY DERS_KOD, PRACTICE
        ORDER BY maximum DESC 
 ) s
    where ROWNUM = 1;

BEGIN
    OPEN cur;
        LOOP FETCH cur INTO  
            max_count,
            d_kod,
            prac;
        EXIT WHEN cur%NOTFOUND;
        c_type := course_type(max_count, d_kod, prac);
        END LOOP;
   CLOSE cur;
   RETURN(c_type);
END;
 
SET SERVEROUTPUT ON
DECLARE
c_t course_type;
BEGIN
    c_t := getPopularCourse(1, 2016);
    DBMS_OUTPUT.put_line('MAX: ' || c_t.m_count || ' COURSE CODE: ' || c_t.course_code || ' PRACTICE: ' || c_t.prac_teacher);
END;
...
Рейтинг: 0 / 0
ROWNUM и данные
    #40022412
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiQuid,

LOOP можно и не кодировать ведь ROWNUM = 1

.....
stax
...
Рейтинг: 0 / 0
ROWNUM и данные
    #40022423
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
LiQuid,

LOOP можно и не кодировать ведь ROWNUM = 1
А, по-моему, студенту с лабой насрать.
...
Рейтинг: 0 / 0
ROWNUM и данные
    #40022425
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic,

мож и наоборот, надо показать что знает и о циклах

.....
stax
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / ROWNUM и данные
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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