2010-07-19 3 views
0

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

SQL Штат: 22001 Vendor Код: -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

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

+0

Спасибо, я посмотрю, что вы сказали, и продолжайте эту тему! –

+0

понял, спасибо. Вы были на месте. –

1

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

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

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

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

+0

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

Смежные вопросы