2012-09-13 81 views
0

我是SQL Anywhere的新手。我將我們在PostgreSQL 9.1中開發的數據庫移植到SQL Anywhere 12.0.1。我有一個函數返回一個模式的所有組合作爲結果集。模式是一系列字母和數字,組括括號括起來。例如,「A1 [0] [0]] 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存儲過程。當我打電話時,我會得到正確的返回值。只是這個不會返回正確的值。

我的代碼有什麼問題?

託尼

+0

我懷疑這是什麼原因導致你的問題,但你可能想要更改'CREATE TABLE'到'DECLARE LOCAL TEMPORARY TABLE'以避免頭痛... – sybkar

+0

什麼樣的頭痛? –

+0

如果不將表指定爲臨時表,則該過程將在每次運行時嘗試創建它。這隻會在第一次運作。如果你看一下'DECLARE LOCAL TEMPORARY TABLE',它只會聲明表存在存儲過程的持續時間...我懷疑這是你的行爲。 http://dcx.sybase.com/index.html#1201/en/dbreference/create-table-statement.html http://dcx.sybase.com/index.html#1201/en/dbreference/declare-local -temporary-table-statement.html – sybkar

回答

1

我發現這個問題是不是在存儲過程中,它是在調用存儲過程的語句。

呼叫是這樣寫的:

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

此產生的誤差。另一方面,如果我寫這樣的電話:

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

然後它的工作。第一種語法是它在PostgreSQL中的調用方式;它也使用PostgreSQL的RETURN NEXT語句來返回值。不同的數據庫,語法不同。

相關問題