首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用变量给出的列值插入IBExpert

用变量给出的列值插入IBExpert
EN

Stack Overflow用户
提问于 2019-09-26 06:52:19
回答 1查看 448关注 0票数 2

在IBExpert中,我正在循环“主过程”中的日期,并尝试将当前循环的日期设置为我要插入的表的“日期”列中的值。

我要插入的表非常简单:

代码语言:javascript
复制
Table Name: FTE_TABLE
|---------------------|------------------|------------------|
|         GESCHST     |        DATUM     |       FTE        |
|---------------------|------------------|------------------|
|         Integer     |        Date      |      Integer     |
|---------------------|------------------|------------------|

我试过很多方法。不过,我的理解是,它应该有点像这样:

代码语言:javascript
复制
FOR EXECUTE STATEMENT
('
SELECT
    geschst,
    :XDATUM_FILTER as DATUM,
    count(personalnr)

FROM personal

WHERE
    eintritt1 is not null
    and (austritt1 is null or austritt1 >=  :XDATUM_FILTER)

GROUP BY geschst, DATUM
')
(XDATUM_FILTER := XDATUM_FILTER)

          on external 'xxx'
          as user 'xxx' password 'xxx'

          into :XGESCHST, :XDATUM, :XFTE

 do
  begin

    execute statement

    ('insert into FTE (GESCHST, DATUM, FTE_TABLE)

  values

(:GESCHST, :DATUM, :FTE)
')

   (GESCHST:= XGESCHST, DATUM := XDATUM, FTE:=XFTE)

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

  end

我收到一条错误信息:

代码语言:javascript
复制
Error Message:
----------------------------------------
Unsuccessful execution caused by system error that does not preclude 
successful execution of subsequent statements.
Execute statement error at isc_dsql_prepare :
335544569 : Dynamic SQL Error
335544436 : SQL error code = -804
335544573 : Data type unknown

预期的结果是,GESCHST和FTE列使用SELECT语句的返回值填充,而其中的DATUM列填充变量XDATUM_FILTER。

谢谢您的提示!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-26 11:57:27

如果在select子句中使用一个参数(就像对:XDATUM_FILTER那样),那么Firebird不知道该参数的数据类型。这将导致数据类型未知错误。

要解决这个问题,您需要显式地将参数强制转换为所需的类型,因此请使用:

代码语言:javascript
复制
SELECT
    geschst,
    cast(:XDATUM_FILTER as DATE) as DATUM,
    count(personalnr)

这仅适用于最近的Firebird 3.0和更高版本,在早期版本中不可能使用强制转换参数。

原因是Firebird需要在准备时知道参数的类型,并且它不能使用变量来确定这一点。

但是,您也可以不使用该列:不需要在远程数据库中选择该列才能获得所需的结果。

另外,如果您选择的远程数据库和要插入的远程数据库是同一个数据库,那么使用INSERT ... SELECT可能会更好(更快和更简单),而不是选择、迭代结果和为每一行插入。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58111068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档