2013-04-21 62 views
3

Firebird和InterBase以BLR(標記化)格式保存已編譯的存儲過程和觸發器。Firebird BLR是否包含相關的字段大小?

但我真的不知道BLR的結構。

字段大小是BLR的一部分嗎?

當存儲過程包含兩個字段(源和目標)時我會遇到一些問題,後來我會更改這兩個字段的大小嗎?

例如他們是varchar(50)長,但現在我將它們更改爲varchar(100)與系統表更新。會發生什麼?它只會複製50個字符,或全部(100)?

還是BLR只包含對象鏈接(表和字段)?

我會嘗試與「僞」代碼來演示:

begin 
    for select comp_id, comp_name from companies where ... 
    into :ci, :cn 
    do begin 
     -- somehow we're adding this to another table 
     insert into new_clients (id, name) values (:ci, :cn); 
    end 
end; 

這可能是一個觸發器或存儲過程。

  1. Comp_namenew_clients.name最初是varchar(50)
  2. 我添加此過程或觸發器。它一天工作正常。
  3. 後來我意識到這些字段太短而不適合我的數據。
  4. 我使用GUI(例如IBExpert)將這些字段更改爲varchar(150)
  5. 沒關係,現在都是varchar(150)

然後會發生什麼?

  1. 如果BLR也包含字段大小,那麼無所謂我改變了字段的大小。觸發器複製50個字符,因爲它已預先編譯過之前的長度。
  2. 如果BLR只使用關聯/鏈接/標記到表和字段,我們可以更改字段而不用擔心複製功能。

問題是一樣的:BLR是否包含相關字段的大小?

回答

4

首先,你可以在ISQL看到BLR過程的:

 
SQL> create or alter procedure p1 (i1 varchar(10), i2 varchar(20)) returns (o1 varchar(30)) as begin end! 
SQL> set blob all! 
SQL> commit! 
SQL> select rdb$procedure_blr from rdb$procedures where rdb$procedure_name = 'P1'! 

blr_version5, 
blr_begin, 
    blr_message, 0, 4,0, 
     blr_varying2, 0,0, 10,0, 
     blr_short, 0, 
     blr_varying2, 0,0, 20,0, 
     blr_short, 0, 
    blr_message, 1, 3,0, 
     blr_varying2, 0,0, 30,0, 
     blr_short, 0, 
     blr_short, 0, 
    blr_receive, 0, 
    ... 
blr_eoc 

第二,不要,永遠,更改系統表。

第三,是的,你會遇到問題!這就是爲什麼沒有ALTER PROCEDURE PARAMETER命令。

+0

你的答案是好的,但我的意思是領域而不是參數。我重新回顧了這個問題......對於誤解的內容感到抱歉。 – durumdara 2013-04-22 08:32:02

+1

您可以按照我指出的方式檢查BLR。但不管它是否工作,我仍然不推薦系統表變化。 – 2013-04-22 10:36:50

相關問題