Что не так с этой хранимой процедурой? - PullRequest
0 голосов
/ 19 июля 2010

очень близко к запуску моей первой хранимой процедуры. Этот компилируется, но когда я запускаю его с 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
    ;

Ответы [ 2 ]

2 голосов
/ 19 июля 2010

Я полагаю, что ошибка, которую вы получаете здесь, на самом деле происходит до того, как ваша процедура даже будет вызвана. У вас есть процедура, определенная параметром 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.

1 голос
/ 19 июля 2010

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

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

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

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

...