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

问题描述 投票:3回答:1

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仅使用关联/链接/标记到表和字段,我们可以更改字段而不必担心复制功能。

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

stored-procedures size field firebird
1个回答
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命令。

© www.soinside.com 2019 - 2024. All rights reserved.