Гость
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Аналог ROWCOUNT? / 9 сообщений из 9, страница 1 из 1
04.07.2005, 18:47
    #33148783
ak@
ak@
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог ROWCOUNT?
Какой аналог ROWCOUNTов есть в DB2? Есть ли к-либо прямые аналоги?
T-SQL:
1) Возвращает нужные N записей
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
CREATE PROCEDURE GetTopN
@top int
AS
IF @top >  0 
    SET ROWCOUNT @top

SELECT * FROM myTable ORDER BY  1 

2) @@ROWCOUNT - глобальная переменная, показывает сколько записей было выбрано/вставлено/изменено предыдущим запросом. В примере - кол-во записей в таблице anotherTable.
Код: plaintext
1.
2.
3.
4.
INSERT myTable(field1)
SELECT id FROM anotherTable

RETURN @@ROWCOUNT

Спасибо.
...
Рейтинг: 0 / 0
04.07.2005, 19:02
    #33148808
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог ROWCOUNT?
http://]www.sql.ru/forum/actualthread.aspx?tid=145754&pg=-1
...
Рейтинг: 0 / 0
04.07.2005, 19:02
    #33148809
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог ROWCOUNT?
http://]http://www.sql.ru/forum/actualthread.aspx?tid=145754&pg=-1
...
Рейтинг: 0 / 0
04.07.2005, 19:16
    #33148835
ak@
ak@
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог ROWCOUNT?
Нет, TORT, это не то. По той ссылке - обсуждение проблемы автонумерации. А мне нужны 2 вещи:
1) Как выбрать первые N записей (N как параметр процедуры)
2) Как узнать, сколько записей было выбрано/вставлено/изменено/удалено предыдущим sql statement.
...
Рейтинг: 0 / 0
04.07.2005, 19:27
    #33148851
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог ROWCOUNT?
Выбрать первые N записей....
fetch first N rows only
...
Рейтинг: 0 / 0
04.07.2005, 20:53
    #33148909
ak@
ak@
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог ROWCOUNT?
Опять же - первые N записей, где N - это не фиксированной число, а параметр процедуры. Мне почему-то кажется, что так написать будет неправильно:
Код: plaintext
1.
2.
CREATE PROCEDURE GetTopN (IN v_top INT)
SELECT * FROM myTable FETCH FIRST v_top ROWS ONLY;

Так что оба вопроса остаются открытыми.

Помогите!
...
Рейтинг: 0 / 0
05.07.2005, 08:54
    #33149188
TORT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог ROWCOUNT?
CREATE PROCEDURE PROC1
(
IN ROWCOUNT INTEGER
)
LANGUAGE SQL
RESULT SETS 1
BEGIN

declare cmd varchar(1000);
declare c1 cursor with return for s1;

set cmd = 'select * from mytable order by mycolumn fetch first'||char(rowcount)||' rows only';
PREPARE s1 from cmd;
open c1;


END

Мож так???
...
Рейтинг: 0 / 0
05.07.2005, 10:58
    #33149479
Victor Metelitsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог ROWCOUNT?
Ограничение количества записей:

Такие конструкции непозволительны:
Код: plaintext
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.
-- почему-то FETCH FIRST нельзя использовать во внешнем селекте
CREATE FUNCTION xxx (n INTEGER)
     RETURNS TABLE (m INTEGER)
     LANGUAGE SQL
     READS SQL DATA
     NO EXTERNAL ACTION
     RETURN
       SELECT person_Id
         FROM APLUS.SEGMENT
         ORDER BY person_id
         FETCH FIRST  10  ROWS ONLY
    ;
-- в FETCH FIRST нельзя использовать переменную вместо константы
CREATE FUNCTION xxx (n INTEGER)
     RETURNS TABLE (m INTEGER)
     LANGUAGE SQL
     READS SQL DATA
     NO EXTERNAL ACTION
     RETURN
       WITH temp(person_id) AS (
       SELECT person_Id
         FROM APLUS.SEGMENT
         ORDER BY person_id
         FETCH FIRST n ROWS ONLY
     ) select * from temp;

Такое можно:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
-- FETCH FIRST во внутреннем селекте, константа
CREATE FUNCTION xxx (n INTEGER)
     RETURNS TABLE (m INTEGER)
     LANGUAGE SQL
     READS SQL DATA
     NO EXTERNAL ACTION
     RETURN
       WITH temp(person_id) AS (
       SELECT person_Id
         FROM APLUS.SEGMENT
         ORDER BY person_id
         FETCH FIRST  10  ROWS ONLY
     ) select * from temp;

Вы нуждаетесь в :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE FUNCTION xxx (n INTEGER)
     RETURNS TABLE (m INTEGER)
     LANGUAGE SQL
     READS SQL DATA
     NO EXTERNAL ACTION
     RETURN
  SELECT person_id FROM
    (SELECT
       ROW_NUMBER() OVER() AS r#, person_id
     FROM APLUS.SEGMENT
    ) AS e
  WHERE r# <= n


Подсчет изменившихся строк:
Код: plaintext
1.
2.
3.
  DECLARE rcount IINTEGER;
  UPDATE ... ;
  GET DIAGNOSTICS rcount = ROW_COUNT; -- это специальная синтаксическая конструкция

Но в случае FOR вам придется ROWCOUNT эмулировать вручную:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
  SET rcount =  0 ;
  FOR xxx AS 
    SELECT ..
  DO
    INSERT INTO T1 VALUES (...);
    INSERT INTO T2 VALUES(IDENTITY_VAL_LOCAL()...);
    SET rcount=rcount+ 1 ;
  END FOR;
...
Рейтинг: 0 / 0
05.07.2005, 17:05
    #33150703
ak@
ak@
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог ROWCOUNT?
Спасибо, Виктор. Как всегда исчерпывающе.
GET DIAGNOSTICS я использовал, чтобы получить значение, возвращаемое вызываемой процедурой в RETURN, а вот про ROW_COUNT не знал.
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Аналог ROWCOUNT? / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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