IBExpert 插入变量给定的列值
IBExpert insert into with column value given by variable
在 IBExpert 中,我在 "Master Procedure" 中循环日期并尝试将当前循环日期设置为 "Date" 列中的值 Table 我正在插入.
我要插入的 Table 非常简单:
Table Name: FTE_TABLE
|---------------------|------------------|------------------|
| GESCHST | DATUM | FTE |
|---------------------|------------------|------------------|
| Integer | Date | Integer |
|---------------------|------------------|------------------|
我试过很多方法。不过我的理解是它应该看起来像这样:
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
我收到此错误消息:
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 语句的 return 值,而 DATUM 列填充了变量 XDATUM_FILTER
提前感谢您的任何提示!
如果您在 select 子句中使用参数(就像您使用 :XDATUM_FILTER
一样),那么 Firebird 不知道该参数的数据类型。这会导致 Data type unknown 错误。
要解决此问题,您需要将参数显式转换为所需的类型,因此请使用:
SELECT
geschst,
cast(:XDATUM_FILTER as DATE) as DATUM,
count(personalnr)
这仅适用于最近的 Firebird 3.0 及更高版本,在早期版本中无法转换参数。
原因是Firebird在准备时需要知道参数的类型,而不能使用变量来确定。
但是,您也可以只省略此列:您不需要 select 远程数据库中的此列来获得所需的结果。
此外,如果您 select 从远程数据库和您要插入的远程数据库是同一个数据库,使用 INSERT ... SELECT
而不是 selecting,迭代结果并为每一行插入。
在 IBExpert 中,我在 "Master Procedure" 中循环日期并尝试将当前循环日期设置为 "Date" 列中的值 Table 我正在插入.
我要插入的 Table 非常简单:
Table Name: FTE_TABLE
|---------------------|------------------|------------------|
| GESCHST | DATUM | FTE |
|---------------------|------------------|------------------|
| Integer | Date | Integer |
|---------------------|------------------|------------------|
我试过很多方法。不过我的理解是它应该看起来像这样:
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
我收到此错误消息:
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 语句的 return 值,而 DATUM 列填充了变量 XDATUM_FILTER
提前感谢您的任何提示!
如果您在 select 子句中使用参数(就像您使用 :XDATUM_FILTER
一样),那么 Firebird 不知道该参数的数据类型。这会导致 Data type unknown 错误。
要解决此问题,您需要将参数显式转换为所需的类型,因此请使用:
SELECT
geschst,
cast(:XDATUM_FILTER as DATE) as DATUM,
count(personalnr)
这仅适用于最近的 Firebird 3.0 及更高版本,在早期版本中无法转换参数。
原因是Firebird在准备时需要知道参数的类型,而不能使用变量来确定。
但是,您也可以只省略此列:您不需要 select 远程数据库中的此列来获得所需的结果。
此外,如果您 select 从远程数据库和您要插入的远程数据库是同一个数据库,使用 INSERT ... SELECT
而不是 selecting,迭代结果并为每一行插入。