在函数调用中不断出现“Invalid parameter”错误

时间:2012-09-13 15:38:22

标签: stored-procedures sqlanywhere

我是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 个答案:

答案 0 :(得分:1)

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

电话是这样写的:

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

这产生了错误。另一方面,如果我写这样的电话:

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

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