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)
。varchar(150)
。varchar(150)
。然后会发生什么?
问题是一样的:BLR是否包含相关字段的大小?
首先,您可以在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
命令。