2012-10-25 49 views
2

我正在嘗試創建一個存儲過程,該過程將佔用50個字節的字符串,並一次掃描一個字節,以查找逗號。一旦發現我想更新一個字段,然後繼續掃描字符串以查找其他逗號。使用Firebird數據庫的存儲過程中的錯誤

我正在使用Firebird數據庫並使用DBVisualizer來開發代碼。

@delimiter ++; 

CREATE PROCEDURE scan_for_comma(
     lastname_field CHAR(50), 
     sr_bold_id  int 
) 
RETURNS (
    comma_flag varchar(1)) 
    AS 
declare variable max_bytes inv default 50; 
declare variable I integer; 

BEGIN 
I = 0; 
While 
    (I <= max_bytes) 
    DO 
    Begin 
    if (substring(name_field from I for 1) = ',') then 
    Begin 
     comma_flag = 'Y' 
     I = I +1 
     UPDATE sr_address 
     SET lastname = (substring(name_field from i for 1) = ' ') 
     WHERE bold_id = :sr_bold_id 
    end  
    ELSE 
    (substring(name_field from loop_cnt for 1) != ',') then 
     Begin 
     I = I +1 
     END 
    END 
END 
++ 
@delimiter ;++ 

我得到這個錯誤

14時45分34秒[@DELIMITER - 0行(S),0.000秒]
命令處理
14時45分34秒[CREATE - 0行,0.000秒]
[錯誤代碼:335544569,SQL狀態:HY000]
GDS異常。 335544569.
動態SQL錯誤SQL錯誤代碼= -104令牌未知 - 第21行,第12欄 十四時45分34秒[@DELIMITER - 0行(S),0.000秒]
命令處理...
3執行的語句(多個),0行(或多個)受影響的,EXEC /提取時間:0.000/0.000秒
[2成功,0的警告,1個錯誤]

任何幫助/方向將不勝感激。

非常感謝。

+0

什麼是「loop_cnt」?它是可變的嗎?然後在哪裏宣佈和設置? –

回答

1

我不知道DBVisualizer中,但我會嘗試語法:

set term ++ ; 

create procedure ... 
: 
end ++ 

set term ; ++ 
0

您應該添加一個暫停命令返回行。 實施例:

comma_flag = 'Y'; 
suspend; -- returns a row 
0

在表達

... 
    ELSE 
    (substring(name_field from loop_cnt for 1) != ',') then 
    ... 

缺少關鍵字IF ELSE

0

在ISQL它不@delimiter,但SET TERM,然而這僅僅是關於ISQL和一些其他工具(如FlameRobin)。

但是,使用SET TERM並不是特定於Firebird本身(數據庫引擎本身不知道該命令)。很可能你不需要在這個工具中指定分隔符。只要不在程序的END之後使用分隔符。

相關問題