gpt4 book ai didi

stored-procedures - Firebird BLR 是否包含相关字段大小?

转载 作者:行者123 更新时间:2023-12-04 07:42:12 24 4
gpt4 key购买 nike

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)

然后会发生什么?

  1. 如果 BLR 也包含字段大小,那么我更改字段大小也没关系。 50 个字符的触发器副本,因为它已经预先编译了长度。
  2. 如果 BLR 只使用 relates/links/tokens 到表和字段,我们可以更改字段而不必担心复制功能。

问题是一样的: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 命令的原因。

关于stored-procedures - Firebird BLR 是否包含相关字段大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16133713/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com