0

SQLAnywhereは初めてです。PostgreSQL9.1で開発したデータベースをSQLAnywhere12.0.1に移植しています。パターンのすべての組み合わせを結果セットとして返す関数があります。パターンは一連の文字と数字で、グループは角かっこで囲まれています。たとえば、「A1 [0O] [0O] [0OU] Z1」は、そのようなパターンの1つです。この関数は、角かっこで囲まれていない文字をそのままコピーし、角かっこで囲まれたすべての文字の組み合わせごとに1つの文字列を返すことになっています。したがって、exmpleの関数によって返される値の1つは、「A1000Z1」である必要があります。もう1つは「A1O00Z1」などです。

関数を呼び出すたびに、SQLAnywhereから次のメッセージが表示されます。

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のRETURNNEXTステートメントを使用して値を返しました。異なるデータベース、異なる構文。

于 2012-09-13T16:42:16.483 に答える