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;
这可能是触发器或存储过程。
Comp_name
,并且new_clients.name
最初是varchar(50)
。- 我添加了这个过程或触发器。它可以正常工作一天。
- 后来我意识到这些字段太短而无法容纳我的数据。
- 我使用 GUI(例如 IBExpert)将这些字段更改为
varchar(150)
. - 没关系,
varchar(150)
现在都是。
那么会发生什么呢?
- 如果 BLR 也包含字段大小,那么我更改字段的大小并不重要。50 个字符的触发器副本,因为它已经预编译了先前的长度。
- 如果 BLR 只使用表和字段的关联/链接/标记,我们可以更改字段而无需担心复制功能。
问题是一样的:BLR 是否包含相关字段的大小?