UDF, возвращающая различные операторы SQL - PullRequest
0 голосов
/ 30 мая 2018

Я пытаюсь вернуть два разных оператора SQL в UDF на основе условия IF.Пока я не смог сделать это правильно, приведенный ниже код не работает.Как я могу это сделать?

CREATE FUNCTION BELSIZE.TEST (aSTRING VARCHAR(50))
    RETURNS TABLE(
    column1 INTEGER
    , column2 INTEGER   
    , column3 VARCHAR(50)
 )
 ------------------------------------------------------------------------
F1: BEGIN ATOMIC

DECLARE v_string VARCHAR(50);
SET v_string = aSTRING;

IF v_string = '123' THEN 

        With v (column1, column2, column3) as (
            VALUES (1, 10231011, 'PRINCIPAL')
            , (1, 10231012, 'ADDITIONAL')
            , (-1, 10231031, 'REDEEM')
        ) select * from v;

END IF;

RETURN
        With v (column1, column2, column3) as (
            VALUES (1, 10231011, 'PRINCIPAL 456')
            , (1, 10231012, 'ADDITIONAL 456')
            , (-1, 10231031, 'REDEEM 456')
        ) select * from v;


END

Спасибо.

Ответы [ 3 ]

0 голосов
/ 30 мая 2018

Вы должны указать свою платформу и версию Db2 ...

Однако я не думаю, что здесь что-то изменится.

Способ, которым Db2 возвращает строки из Определенного пользователемТабличная функция (UDTF) или хранимая процедура по этому вопросу завершается курсором, определенным внутри функции / процедуры, оставленной открытой.

Так что вам нужно что-то вроде этого ...

CREATE FUNCTION BELSIZE.TEST (aSTRING VARCHAR(50))
    RETURNS TABLE(
    column1 INTEGER
    , column2 INTEGER   
    , column3 VARCHAR(50)
 )

begin atomic
declare C1 cursor with return to client for
        With v (column1, column2, column3) as (
            VALUES (1, 10231011, 'PRINCIPAL')
            , (1, 10231012, 'ADDITIONAL')
            , (-1, 10231031, 'REDEEM')
        ) select * from v;

declare C2 cursor with return to client for 
        With v (column1, column2, column3) as (
            VALUES (1, 10231011, 'PRINCIPAL 456')
            , (1, 10231012, 'ADDITIONAL 456')
            , (-1, 10231031, 'REDEEM 456')
        ) select * from v;

IF v_string = '123' THEN 
  open C1;
else
  open C2;
END IF;

RETURN
END
0 голосов
/ 30 мая 2018

Я бы закодировал ваш UDF примерно так

CREATE FUNCTION BELSIZE.TEST (aSTRING VARCHAR(50))
    RETURNS TABLE(
      column1 INTEGER
    , column2 INTEGER   
    , column3 VARCHAR(50)
 )
RETURN
    SELECT column1, column2, column3 FROM TABLE(
        VALUES (0, 1, 10231011, 'PRINCIPAL')
        ,      (0, 1, 10231012, 'ADDITIONAL')
        ,      (0,-1, 10231031, 'REDEEM')
        ,      (1, 1, 10231011, 'PRINCIPAL 456')
        ,      (1, 1, 10231012, 'ADDITIONAL 456')
        ,      (1,-1, 10231031, 'REDEEM 456')
        ) AS v(i, column1, column2, column3)
    WHERE i = CASE WHEN aSTRING = '123' THEN 0 ELSE 1 END
0 голосов
/ 30 мая 2018

Так как вам нужно 2 разных результата на основе входной строки, ваши операторы возврата должны соответствовать логике IF-ELSE.То, как вы обрабатываете это неправильно в вашем запросе.Он всегда пытается вернуть единицу в блоке возврата.

Я исправил запрос, соответствующий вашему требованию.используйте логику IF-ELSE из этого.Это написано в SQL-SERVER

CREATE FUNCTION dbo.testFn(@aSTRING  VARCHAR(50))  
RETURNS @rtnTable TABLE(
    column1 INTEGER
    , column2 INTEGER   
    , column3 VARCHAR(50)
 )   
AS   
BEGIN  

    IF @aSTRING = '123'
    BEGIN
        INSERT INTO @rtnTable
        VALUES (1, 10231011, 'PRINCIPAL')
            , (1, 10231012, 'ADDITIONAL')
            , (-1, 10231031, 'REDEEM')
    END
    ELSE
    BEGIN 
        INSERT INTO @rtnTable
        VALUES (1, 10231011, 'PRINCIPAL 456')
            , (1, 10231012, 'ADDITIONAL 456')
            , (-1, 10231031, 'REDEEM 456')
    END 

    RETURN
END
...