0

我是 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 存储过程中。当我调用它时,我得到了一个正确的返回值。只是这个不会返回正确的值。

我的代码有什么问题?

托尼

4

1 回答 1

1

我发现问题不在存储过程中,而是在调用存储过程的语句中。

调用是这样写的:

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

这产生了错误。另一方面,如果我这样写调用:

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

然后它工作。第一个语法是它在 PostgreSQL 中的调用方式;它还使用 PostgreSQL 的 RETURN NEXT 语句来返回值。不同的数据库,不同的语法。

于 2012-09-13T16:42:16.483 回答