Что не так с этой хранимой процедурой?

очень близко к запуску моей первой хранимой процедуры. Этот компилируется, но когда я запускаю его с call test.fttest5('YEAR');, он выдает ошибку

Состояние SQL: 22001 Код поставщика: -303 Сообщение: [SQL0303] Переменная хоста *N несовместима. Причина . . . . . : FETCH, SELECT, CALL, SET, VALUES INTO, GET DIAGNOSTICS, GET DESCRIPTOR или SET DESCRIPTOR невозможно выполнить, поскольку тип данных переменной хоста *N несовместим с типом данных соответствующего элемента списка.

Также как мне указать неограниченный тип данных в моей хранимой процедуре? Я пробовал DECLARE temp VARCHAR(MAX);, но это не сработало. Моя платформа — ISeries DB2 V5R4.

create procedure test.fttest5
    (IN ftExpression CHARACTER(30))
    language sql
    reads sql data
    dynamic result sets 1
    begin

    declare cmd VARCHAR(50);
    declare whr VARCHAR(50)
;

    declare x cursor for sl;
    set cmd='select * from testSchema.tempTable' ;
    if ftExpression IS NOT NULL
 THEN
     set whr= ftExpression;
    END IF;

    set cmd=cmd || CASE WHEN whr IS NULL THEN '' ELSE ' ORDER BY ' || whr END;  
    prepare sl from cmd;
    open x;
    return;
    end
    ;

person Zo Has    schedule 19.07.2010    source источник


Ответы (2)


Я считаю, что ошибка, которую вы здесь получаете, на самом деле происходит еще до того, как ваша процедура будет вызвана. У вас есть процедура, определенная с параметром CHAR, но вы вызываете ее с VARCHAR. Когда вы вводите SQL в интерактивном режиме, такие параметры поступают как VARCHAR.

Попробуйте назвать это так: call test.fttest5(CHAR('YEAR'))

Или вы также можете изменить параметр на VARCHAR, хотя вы все равно захотите проверить его вызов с помощью CHAR, чтобы увидеть, что произойдет.

Однако я думаю, что вам не хватает строки SET RESULT SETS CURSOR x. Также я бы поставил подготовку перед объявлением, так как я думаю, что порядок может быть важен.

Документация IBM находится по адресу http://publib.boulder.ibm.com/infocenter/iseries/v6r1m0/topic/rzaik/rzaikspresultsets.htm.

person Brandon Peterson    schedule 19.07.2010
comment
Спасибо, я посмотрю, что вы сказали, и сохраню эту тему! - person Zo Has; 19.07.2010

Выбор * плох, особенно если вы выбираете из сложных или больших представлений.

Курсоры вообще плохи, потому что вы перебираете каждую строку, а не работаете с наборами.

Также подумайте, нужен ли вообще здесь динамический SQL?

Какова цель этой хранимой процедуры? Это выглядит довольно просто, и мне интересно, можно ли переписать его, используя наборы вместо итерации с помощью курсора?

person Community    schedule 19.07.2010
comment
Спасибо за ответ, это всего лишь образец заявления и процедура тестирования. Фактический сценарий представляет собой динамическое предложение where для длинного фильтра и поискового запроса (DYNAMIC WHERE & ORDER BY). Все, что я знаю на данный момент, это то, что мне нужно использовать курсор, чтобы моя хранимая процедура работала, можете ли вы показать мне, как использовать наборы в моем примере? - person Zo Has; 19.07.2010