Вывести последнюю и k-ю запись

Дмитрий3Б

Написал запрос который выводит первую запись!!!! Необходимо вывести последнюю и k-ю запись!!!!! что нужно добавить!!!! ????
SET SERVEROUTPUT ON  
DECLARE
knig_id VARCHAR2(4);
id_cind_book VARCHAR2(4);
name_book   VARCHAR2 (100);
name_autor VARCHAR2(100);
cena    NUMBER;
kol_vo  VARCHAR2(4);
dop_inf VARCHAR2(100);
CURSOR cur IS
SELECT *
FROM bibli.KNIGI;
 
BEGIN
OPEN cur;
FETCH cur  INTO knig_id, id_cind_book, name_book, name_autor, cena, kol_vo, dop_inf;
DBMS_OUTPUT.enable();
DBMS_OUTPUT.PUT_LINE( 'ID:'|| knig_id);
DBMS_OUTPUT.PUT_LINE( 'Код жанра: ' || id_cind_book );
DBMS_OUTPUT.PUT_LINE( 'Название книги: ' || name_book);
DBMS_OUTPUT.PUT_LINE( 'Автор: ' || name_autor);
DBMS_OUTPUT.PUT_LINE( 'Цена: ' || cena);
DBMS_OUTPUT.PUT_LINE( 'Количество: ' || kol_vo);
DBMS_OUTPUT.PUT_LINE( 'Дополнительная информация: ' || dop_inf);
 
CLOSE cur;
END;
Пробую через цикл!!! Выводит те поля где id>13 Все работает, но только проблема в том что она выводит пустые поля!!!!
SET SERVEROUTPUT ON 
DECLARE
knig_id VARCHAR2(4);
id_cind_book VARCHAR2(4);
name_book   VARCHAR2 (100);
name_autor VARCHAR2(100);
cena    NUMBER;
kol_vo  VARCHAR2(4);
dop_inf VARCHAR2(100);
CURSOR addresses_c IS
SELECT * FROM bibli.knigi
WHERE knig_id >13;
BEGIN
 
 
FOR rec IN addresses_c LOOP
 
DBMS_OUTPUT.PUT_LINE( 'ID:'|| knig_id);
DBMS_OUTPUT.PUT_LINE( 'Код жанра: ' || id_cind_book );
DBMS_OUTPUT.PUT_LINE( 'Название книги: ' || name_book);
DBMS_OUTPUT.PUT_LINE( 'Автор: ' || name_autor);
DBMS_OUTPUT.PUT_LINE( 'Цена: ' || cena);
DBMS_OUTPUT.PUT_LINE( 'Количество: ' || kol_vo);
DBMS_OUTPUT.PUT_LINE( 'Дополнительная информация: ' || dop_inf);
 
END LOOP;
END;
Выводит: ID: Код жанра: Название книги: Автор: Цена: Количество: Дополнительная информация: ID: Код жанра: Название книги: Автор: Цена: Количество: Дополнительная информация:Почему он выводит так? чего не хватает!!! Хотелось бы что бы он выводил как на картинке !
9 ответов

Дмитрий3Б

а ты уверен что в твоей таблице есть данные удовлетворяющие условию запроса
SELECT * FROM bibli.knigi WHERE knig_id >13


Дмитрий3Б

А какая связь между knig_id и курсором или rec?


Дмитрий3Б

хотя я бред написал. если бы данных не было. цикл не выполнился бы


Дмитрий3Б

Почему он выводит так? чего не хватает!!!
Во втором варианте ты выводишь не значения полей строки курсора, а значения переменных, которым не присвоены значения. Что запросил, то и получил.


Дмитрий3Б

Ну я почему то так сразу и подумал!!! Но как мне сделать что бы эти значения взялись из моей таблицы?


Дмитрий3Б

как мне сделать что бы эти значения взялись из моей таблицы
Запись FOR rec означает, что на каждом шаге цикла очередная строка выбирается в RECORD rec с именами полей, которые соответствуют именам в SELECT. Соответственно и надо обращаться к полям record, т.е. rec.id (если поле называется id)


Дмитрий3Б

Спасибо за помощь Grossmeister!!!!! ) Все работает !Остается теперь вывести последнюю строку!!! Можно это сделать используя этот же код ?


Дмитрий3Б

Остается теперь вывести последнюю строку!!! Можно это сделать используя этот же код ?
Ну-у-у, это обычная задачка по программированию, даже без БД. Например, на каждом шаге цикла сохраняй значения в переменные. После выхода из цикла в переменных останется последнее значение.


Дмитрий3Б

Я сделал следующим образом. написал условие что бы выводил строку с максимальным id. у меня в таблице 15 записей, но он почему то выводит 9.
WHERE knig_id = (SELECT MAX(knig_id)FROM bibli.knigi);