如何在存储过程的execute语句中使用生成器?

时间:2019-07-19 06:23:31

标签: sql firebird firebird2.5 ibexpert

我正在尝试在IBExpert中为Firebird 2.5数据库创建一个简单的存储过程。我在使用发电机时遇到了麻烦。我想我已经创建了有效的生成器和触发器。但是我不知道如何在我的execute语句中应用它们。

表格:

ID            BIGINT NOT NULL,
DATUM         INTEGER,
KOSTENST      INTEGER,
KUNDENNUMMER  INTEGER,
DISPONENT     CHAR(5),
KONTAKTART    CHAR(2)

触发:

CREATE OR ALTER trigger kontakte_erw_id_bi for kontakte_erw_id
active before insert position 0
AS
BEGIN
if (NEW.ID is NULL) then NEW.ID = GEN_ID(ID_KONTAKTE, 1);
END 

生成器:

CREATE SEQUENCE ID_KONTAKTE;
ALTER SEQUENCE ID_KONTAKTE RESTART WITH 0;

程序声明(我认为问题出在这里?如何处理填充ID列的触发器?):

for execute statement('
  SELECT
        KONTAKTE.DATUM,
        KUNDEN.KOSTENST,
        KUNDEN.KUNDENNR,
        KONTAKTE.DISPONENT,
        KONTAKTE.KONTAKTART

FROM KONTAKTE
INNER JOIN KUNDEN ON KONTAKTE.KUNDENNR = KUNDEN.KUNDENNR

')
          on external 'db'
          as user 'xxx' password xxx

          into :XDATUM, :XKOSTENST, :XKUNDENNUMMER, :XDISPONENT, :XKONTAKTART

  do
  begin

    execute statement

    ('update or insert into KONTAKTE_ERW_ID (DATUM, KOSTENST, KUNDENNUMMER, DISPONENT, KONTAKTART)

      values

    (:DATUM, :KOSTENST, :KUNDENNUMMER, :DISPONENT, :KONTAKTART)')


   (DATUM:= XDATUM, KOSTENST := XKOSTENST, KUNDENNUMMER := XKUNDENNUMMER, DISPONENT := XDISPONENT, KONTAKTART := XKONTAKTART)

        on external 'db'
        as user 'xxx' password xxx;

  end

这是我尝试填充图表时遇到的错误:

336003099 : UPDATE OR INSERT field list does not match primary key of table KONTAKTE_ERW_ID
Statement : update or insert into KONTAKTE_ERW_ID (DATUM, KOSTENST, KUNDENNUMMER, DISPONENT, KONTAKTART)

      values

    (?, ?, ?, ?, ?)

1 个答案:

答案 0 :(得分:1)

您的问题是,要使用UPDATE OR INSERT,Firebird需要知道何时行已存在。为此,它要么使用主键,要么使用MATCHING子句(如果提供)。

在您的语句中,您没有提供主键,但也没有提供MATCHING子句,因此Firebird无法确定是否有要更新的行或是否应插入行。

根据您的情况,在语句中包括主键似乎不是一个选择(或者您需要应用一种方案来生成在不同数据库中唯一的标识符),因此,唯一的选择是使用{ {1}}子句。但是,查看您的专栏文章,我不会立即看到可以被认为是独特的内容。