Серверный JavaScript 1.4. Руководство по использованию

       

Работа с Результирующими Наборами


Этот этап применяется ко всем хранимым процедурам.

Как указано в разделе , разные БД возвращают результирующие наборы разными способами. Например, у Вас имеется таблица CUSTINFO со столбцами id, city и name. В Sybase Вы можете использовать такую процедуру для получения первых 200 рядов таблицы:

create proc getcusts as
begin
   select id, name, city from custinfo where custno < 200
end

Если CUSTINFO является таблицей Informix, эквивалентная процедура в Informix может быть:

create procedure getcusts returning int, char(15), char(15);

define rcity, rname char (15);
define i int;foreach
    select id, name, city into i, rname, rcity
       from custinfo
      where id < 200;

   return i, rname, rcity with resume;
end foreach;
end procedure;

Если CUSTINFO - таблица Oracle, эквивалентная процедура Oracle может быть:

create or replace package orapack as
   type custcurtype is ref cursor return custinfo%rowtype
end orapack;create or replace custresultset (custcursor inout orapack.custcurtype)
as begin
   open custcursor for select id, name, city from custinfo
      where id < 200

end custresultset;

Во всех случаях Вы создаёте resultSet -объект для получения информации из хранимой процедуры. Вы делаете это через использование метода resultSet объекта хранимой процедуры так:

resObj = spObj.resultSet();

Как и для Cursor -объектов, resultSet -объекты содержат текущий ряд, то есть ряд, на котором стоит указатель в результирующем наборе. Вначале указатель позиционирован перед первым рядом результирующего набора. Чтобы увидеть значения рядов результирующего набора, Вы используете метод next для перемещения указателя по рядам результирующего набора, как показано в следующем примере:



spobj = connobj.storedProc("getcusts");

if ( spobj && (connobj.majorErrorCode() == 0) ) {

   // Создаётся новый resultSet-объект.
    resobj = spobj.resultSet();   // Перед тем как продолжить, убедитесь, что Вы получили результирующий набор.



   if ( resobj && (connobj.majorErrorCode() == 0) ) {       // Сначала перемещает указатель resultSet-объекта к первому // ряду результирующего набора, а затем циклически проходит по рядам.
       while (resObj.next())
      {
          write("<TR><TD>" + resObj.name + "</TD>");

         write("<TD>" + resObj.city + "</TD>");

          write("<TD>" + resObj.id + "</TD></TR>");
      }

      resobj.close();
   }
}

До тех пор, пока в результирующем наборе имеется следующий ряд, метод next возвращает true и перемещает указатель к следующему ряду. Если указатель достиг последнего ряда результирующего набора, метод next возвращает false.

Предыдущий пример работает с хранимой процедурой Sybase. В этом случае resultSet -объект содержит именованное свойство для каждого столбца результирующего набора. Для процедур Informix и DB2, по контрасту, объект не содержит именованных столбцов. В этом случае Вы можете получить значения, ссылаясь на позицию столбца. Так, для Informix и DB2 Вы можете использовать такой код для вывода аналогичной информации:

spobj = connobj.storedProc("getcusts");

if ( spobj && (connobj.majorErrorCode() == 0) ) {    // Создаётся новый resultSet-объект.

   resobj = spobj.resultSet();

   // Перед тем как продолжить, убедитесь, что Вы получили результирующий набор.

   if ( resobj && (connobj.majorErrorCode() == 0) ) {

      // Сначала перемещает указатель resultSet-объекта к первому // ряду результирующего набора, а затем циклически проходит по рядам.

      while (resObj.next())
      {

          write("<TR><TD>" + resObj[1] + "</TD>");
          write("<TD>" + resObj[2] + "</TD>");
          write("<TD>" + resObj[0] + "</TD></TR>");
       }
      resobj.close();
   }
}

Вы можете использовать позицию столбца для результирующих наборов любой БД, а не только с Informix и DB2. Вы можете использовать имя столбца для хранимой процедуры всех типов БД, а не только Informix или DB2.


Содержание раздела