Firebird BLR是否包含相关的字段大小?

时间:2013-04-21 16:55:01

标签: stored-procedures size field firebird

Firebird和InterBase以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)
  6. 然后会发生什么?

    1. 如果BLR也包含字段大小,那么我改变字段的大小并不重要。触发器复制50个字符,因为它预编译了前一个长度。
    2. 如果BLR仅使用关联/链接/标记到表和字段,我们可以更改字段而不必担心复制功能。
    3. 问题是一样的:BLR是否包含相关字段的大小?

1 个答案:

答案 0 :(得分: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命令的原因。