Продолжайте получать ошибку "Неверный параметр" при вызове функции

Я новичок в SQL Anywhere. Я портирую базу данных, которую мы разработали в PostgreSQL 9.1, на SQL Anywhere 12.0.1. У меня есть функция, которая возвращает все комбинации шаблона в качестве набора результатов. Шаблон представляет собой последовательность букв и цифр с группами, заключенными в квадратные скобки. Например, "A1[0O][0O][0OU]Z1" является одним из таких паттернов, который возможен. Функция должна копировать любые символы не в квадратных скобках, как есть, а затем возвращать одну строку для каждой комбинации всех символов в квадратных скобках. Таким образом, одно значение, возвращаемое функцией для примера, должно быть "A1000Z1"; другой будет "A1O00Z1" и так далее.

Всякий раз, когда я вызываю функцию, я получаю сообщение ниже от SQL Anywhere:

Coult not execute statement.  Function 'AllCombinations' has invalid parameter 'Combination' ('OUT')

Вот источник функции:

CREATE OR REPLACE PROCEDURE "AllCombinations" (
    IN Plate VARCHAR(50)
) RESULT ( Combination VARCHAR(50) )
BEGIN
    DECLARE @Combinations    VARCHAR(8000);
    DECLARE @Combination    VARCHAR(50);
    DECLARE i                INT        DEFAULT 1;

    -- Create the temporary table to hold all of the combinations
    CREATE TABLE #Combinations (
        Combination     VARCHAR(50) NOT NULL
    );

    -- Get all of the combinations AS a big string
    SET @Combinations = "NextDigit"( Plate, 1, '' );

    -- Begin a loop
    BuildCombinations:
    LOOP
        -- Find the i-th combination
        SELECT  row_value INTO @Combination
        FROM    sa_split_list( @Combinations, '|')
        WHERE   line_num = i;

        -- Do we have a string?
        IF @Combination <> '' THEN
            -- We do.  Add it to the Combinations table
            INSERT INTO #Combinations ( Combination ) VALUES ( @Combination );
        ELSE
            -- We do not.  Exit the loop
            LEAVE BuildCombinations;
        END IF;

        -- Move on to the next combination
        SET i = i + 1;
    END LOOP BuildCombinations;

    -- Return all of the combinations we built
    SELECT Combination FROM #Combinations;
END;

Я не верю, что проблема в хранимой процедуре NextDigit. Когда я вызываю это, я получаю верное возвращаемое значение. Просто этот не вернет правильные значения.

Что не так с моим кодом?

Тони

1 ответ

Решение

Я обнаружил, что проблема не в хранимой процедуре, а в выражении, которое вызвало хранимую процедуру.

Звонок был написан так:

SELECT "AllCombinations"( 'A1[0O][0O][0OU]Z1' );

Это привело к ошибке. Если, с другой стороны, я напишу вызов так:

SELECT Combination FROM "AllCombinations"( 'A1[0O][0O][0OU]Z1' );

Тогда это работает. Первый синтаксис был таким, как он назывался в PostgreSQL; он также использовал оператор RETURN NEXT PostgreSQL для возврата значений. Другая база данных, другой синтаксис.

Другие вопросы по тегам