Понимание SQL. Первый класс



Для получения данных из таблиц, можно использовать запросы. Запросы можно выполнять обращаясь к БД извне, а можно встраивать в процедуры.
Недавно произошла забавная ситуация. При подключении к БД firebird и попытке выполнить запрос следующего содержания:

select sum( tmp_g_doc.kolfakt), cardscla.articul from tmp_g_doc
 left join cardscla on (tmp_g_doc.kod = cardscla.comment)
 where tmp_g_doc.nsopr='текст'_id group by cardscla.articul

я получил сообщение об ошибке Expression evaluation not supported - "вычисление выражений не поддерживается". Ошибка возникает если попытаться выполнить данный запрос из VBS скрипта, подключаясь к базе через ADODB. НО если выполнять запрос в IBexpert, то все в порядке. Что же делать? Я решил затолкать этот запрос к хранимую процедуру и вот что из этого вышло:
begin
 for select sum( tmp_g_doc.kolfakt), cardscla.articul from tmp_g_doc
 left join cardscla on (tmp_g_doc.kod = cardscla.comment)
 where tmp_g_doc.nsopr=:doc_id group by cardscla.articul
 into  :quantity, :art;
  suspend;
 end

Такой текст компилируется, но выдает ошибку при выполнении: "Много строк в одно строчном запросе" (multiple rows in singleton select)
Оказывается правильно писать так:
begin
 for select sum( tmp_g_doc.kolfakt), cardscla.articul from tmp_g_doc
 left join cardscla on (tmp_g_doc.kod = cardscla.comment)
 where tmp_g_doc.nsopr=:doc_id group by cardscla.articul
 into  :quantity,   :art
 do
 begin
  suspend;
 end

Привожу полный текст процедуры:
SET TERM ^ ;
create or alter procedure A_COLLATE_Q (
    DOC_ID varchar(100))
returns (
    ART varchar(10),
    QUANTITY varchar(10))
as
begin
 for select sum( tmp_g_doc.kolfakt), cardscla.articul from tmp_g_doc
 left join cardscla on (tmp_g_doc.kod = cardscla.comment)
 where tmp_g_doc.nsopr=:doc_id group by cardscla.articul
 into  :quantity,   :art
 do
 begin
  suspend;
 end
end^
SET TERM ; ^
GRANT SELECT ON TMP_G_DOC TO PROCEDURE A_COLLATE_Q;
GRANT SELECT ON CARDSCLA TO PROCEDURE A_COLLATE_Q;
GRANT EXECUTE ON PROCEDURE A_COLLATE_Q TO SYSDBA;

Теперь обращаемся к процедуре из скрипта командой:
select * from A_COLLATE_Q('текст')

Профит!
Для понимания. Данные для этого запроса необходимо группировать и суммировать. Этого, как я полагаю ADODB сделать не в силах. Зато сам Firebird с задачей справляется.
Для осознания того к какой тайне вы только что прикоснулись, перейдите по ссылке:
Объяснить эту ошибку не просто