3

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_name,并且new_clients.name最初是varchar(50)
  2. 我添加了这个过程或触发器。它可以正常工作一天。
  3. 后来我意识到这些字段太短而无法容纳我的数据。
  4. 我使用 GUI(例如 IBExpert)将这些字段更改为varchar(150).
  5. 没关系,varchar(150)现在都是。

那么会发生什么呢?

  1. 如果 BLR 也包含字段大小,那么我更改字段的大小并不重要。50 个字符的触发器副本,因为它已经预编译了先前的长度。
  2. 如果 BLR 只使用表和字段的关联/链接/标记,我们可以更改字段而无需担心复制功能。

问题是一样的:BLR 是否包含相关字段的大小?

4

1 回答 1

4

首先,您可以在 ISQL 中看到一个过程的 BLR:

SQL> create or alter procedure p1 (i1 varchar(10), i2 varchar(20)) 返回 (o1 varchar(30)) 作为开始结束!
SQL>设置blob全部!
SQL> 提交!
SQL> select rdb$procedure_blr from rdb$procedures where rdb$procedure_name = 'P1'!

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

其次,永远不要更改系统表。

第三,是的,你会有问题!这就是为什么没有ALTER PROCEDURE PARAMETER命令。

于 2013-04-21T17:32:19.960 回答