Вставка IBExpert со значением столбца, заданным переменной - PullRequest
2 голосов
/ 26 сентября 2019

В IBExpert я зацикливаюсь на датах в «мастер-процедуре» и пытаюсь установить текущую зацикленную дату как значение в столбце «Дата» таблицы, в которую я вставляю.

ТаблицаЯ вставляю в это очень просто:

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, когда столбец DATUM заполнен переменной XDATUM_FILTER

Заранее благодарим за любые подсказки!

1 Ответ

2 голосов
/ 26 сентября 2019

Если вы используете параметр в предложении select (как вы делаете с :XDATUM_FILTER), то Firebird не знает тип данных этого параметра.Это приводит к ошибке Тип данных неизвестен .

Чтобы исправить это, вам нужно явно привести параметр к нужному типу, поэтому используйте:

SELECT
    geschst,
    cast(:XDATUM_FILTER as DATE) as DATUM,
    count(personalnr)

Это толькоработает в последних версиях Firebird 3.0 и выше, в более ранних версиях приведение параметров невозможно.

Причина в том, что Firebird необходимо знать тип параметра во время подготовки, и он не может использовать переменную для определения этого.

Однако вы также можете просто пропустить этот столбец: вам не нужно выбирать этот столбец в удаленной базе данных, чтобы получить желаемые результаты.

Кроме того, если вы используете удаленную базу данных 'Если вы выбираете из и удаленная база данных, в которую вы вставляете, - это одна и та же база данных, лучше (быстрее и проще) использовать INSERT ... SELECT вместо выбора, итерации по результату и вставки для каждой строки..

...