powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Передача даты как параметра в хранимую процедуру
40 сообщений из 40, показаны все 2 страниц
Передача даты как параметра в хранимую процедуру
    #39140412
offsites
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, подскажите как вылечить.

В хранимой процедуре входящий параметр PDate1 типа Date.

используется так
...
WHERE Date1=:PDate1

Из FIBDataset вызываю процедуру:

SelectSQL.Add('SELECT * FROM StoredProcName(:PDate1, ...)');
Prepare;
Params.ParamByName('PDate1').AsDate:=MyDate; // MyDate любой пробовал и NOW и как строку '30.12.2015' по всякому

Попадая в запрос MyDate становится похожа на '30-DEC-2015'
Вываливается ошибка:
Incompatible column/host variable data type.
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39140413
Граур Станислав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
offsitesВ хранимой процедуре входящий параметр PDate1 типа Date.

используется так
...
WHERE Date1=:PDate1

Попадая в запрос MyDate становится похожа на '30-DEC-2015'
Вываливается ошибка:
Incompatible column/host variable data type.

Вызови процедуру из IbExpert , если работает тогда тебе в соседний форум по дельфи.

P.S.
Покажи саму процедуру.
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39140445
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Граур СтаниславПокажи саму процедуру.
В процедуре параметр как строка, как пить дать.
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39140464
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
offsites, при использовании в SQL скрипте предпочитаю указывать дату в ISO формате, т.к. этот формат универсален и поддерживается практически всеми rdbms. В Firebird он также поддерживается, но вместо разделителя 'T' между датой и временем используется [пробел].
Код: plsql
1.
SELECT CAST('2015-12-30 12:30' AS TIMESTAMP) FROM RDB$DATABASE


Из Delphi лучше использовать переменные типа TDateTime.
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39140620
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
offsitesParams.ParamByName('PDate1').AsDate:=MyDate; // MyDate любой пробовал и NOW
и как строку '30.12.2015' по всякому
Врёшь. На строку у тебя должна была ругаться Delphi, поскольку она несовместима с
TDateTime в принципе.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39140646
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

да в .Value он пихает, почти наверняка
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39140647
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochда в .Value он пихает, почти наверняка
ССЗБ.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39140649
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
offsitesSelectSQL.Add('SELECT * FROM StoredProcName(:PDate1, ...)');

чисто процедурное

лучше

Код: pascal
1.
SelectSQL.Text := 'SELECT * FROM StoredProcName(:PDate1, ...)';



Мало ли что у тебя там УЖЕ было, во-первых.
Ну и разные TStrings.BeginUpdate/EndUpdate автоматически
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39140650
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверь после присвоения значения чему равен ParamByName('PDate1').DataType (или FieldType, не помню)

Если ты присвоение выполнил правильно, то он должен стать типа ftDateTime
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39140651
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Особенно хорошо в Value=AsDouble лягут Now() и Date()

Хотя и в компонентах бывают неожиданности, я сейчас с UIB разщвлекаюсь, там у параметров-блоблв .AsxxxString не работают, нужно обходными путями.
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39140665
offsites
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arioch,

нашел вот такое-вот, не знаю оно или нет
ShowMessage(IntToStr(Params.ParamByName('field').SQLType));

Возвращает у поля типа дата значение 510. таблицу соответствия кодов типам данных не нашел, но проверил, если тип Integer, тогда значение 496 (т.е. отличается, а видимо и работает).
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39140667
offsites
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

под строкой подразумевалось установка формата даты руками, т.е. StrToDate('12.12.1222'), чтобы случайно не вышло 12/12/1222.
И еще в ХП тип данных поля менялся с Date на Varchar(10), и тогда просто стринг через параметр.
В общем пробовал по всякому )
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39140668
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
offsites,

Граур СтаниславПокажи саму процедуру.
wadmanВ процедуре параметр как строка, как пить дать.
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39140669
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TIMESTAMP еще тип в SP попробуй
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39140671
offsites
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Процедуру проверял в IBExpert. При запуске высвечивается окошко для ввода значения входных параметров типа Date и Integer (у меня 2 входных параметра). Все отрабатывает без проблем, т.е. с ХП проблем нет.
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39140672
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
offsitesВ общем пробовал по всякому )
По-всякому - не надо. Твой пример из первого поста должен работать. Если нет - давай
точный код, который не работает.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39140676
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
offsitesнашел вот такое-вот, не знаю оно или нет
ShowMessage(IntToStr(Params.ParamByName('field').SQLType));

Нет, тоже интересно, но не оно. Это тип данных в терминах SQL, как думает FIB+

А меня интересовал тип данных в терминах Delphi

http://docwiki.embarcadero.com/Libraries/XE8/en/Data.DB.TParam.DataType

"Возвращает у поля типа дата значение 510. таблицу соответствия кодов типам данных не нашел"

Берешь исходники Firebird и смотришь.
Вариант, берешь исходники Unified Interbase и смотришь.
Вариант, берешь исходники FIB+ и смотришь.

Искать в районе присвоения значений полям и параметрам - там как раз будут простыни методов перевода данных между типами Delphi и типами IB/FB

Спесьял фа йа
uibase.pas
....
(*******************
* SQL definitions *
*******************)

SQL_TEXT = 452; // Array of char
SQL_VARYING = 448;
SQL_SHORT = 500;
SQL_LONG = 496;
SQL_FLOAT = 482;
SQL_DOUBLE = 480;
SQL_D_FLOAT = 530;
SQL_TIMESTAMP = 510;
SQL_BLOB = 520;
SQL_ARRAY = 540;
SQL_QUAD = 550;
SQL_TYPE_TIME = 560;
SQL_TYPE_DATE = 570;
SQL_INT64 = 580;

{$IFDEF FB30_UP}
SQL_BOOLEAN = 32764;
{$ENDIF}

{$IFDEF FB25_UP}
SQL_NULL = 32766;
{$ENDIF}

{$IFDEF IB7_UP}
SQL_BOOLEAN = 590;
{$ENDIF IB7_UP}

(* Historical alias for pre V6 applications *)
SQL_DATE = SQL_TIMESTAMP;
....
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39140677
offsites
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

with dm.DSet do
begin
Active:=False;
SelectSQL.Text:='SELECT * FROM GET_VALUES(:PField1Integer_id, :PField2Date)';
Prepare;
Params.ParamByName('PField1Integer_id').AsInteger:=1;
Params.ParamByName('PField2Date').AsDate:=DateTimePicker1.Date;
Active:=True;
end;
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39140680
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
offsites,

попробуй ...AsDateTime := DateTimePicker1.Date;

или ...AsTimeStamp := DateTimePicker1.Date;

если такое есть

твоя цель - правильно выставленный у параметра .DataType

И кстати тебе в принципе никто не запрещает отладить этот вызов .AsDate := xxx внутрь VCL/FIB+
Равно как и отладить вызов Active := 'false';

Цель все та же, понять выставляется ли DataType у параметра.
Если да - то как это учитывается при переводе значения в формат FB
Если нет - то почем не выставляется

И еще интересно, есть ли в FIB+ разные настройи по передаче даты в разных версиях IB/FB
Если дата действительно библиотекой превращается в строку...
...тогда тем более, отлаживай внутренности Active := False и наткнегшься на вычитывнаи параметров где и будет провер всех этих настроек, если они есть.
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39140681
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Равно как и отладить вызов Active := 'false';

Читать "Active := TRUE"
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39140684
offsites
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DBConstructor,

Не всегда в используемых компонентах типа календарь (на клиенте они могут быть разными) есть Time.
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39140685
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
offsites,

тип все равно один и тот же

type TDate = type double;
type TTime = type double;
type TDateTime = type double;

хотя по факту Date=trunc(DateTime) и Time=frac(DateTime)


но промежуточная переменная имеет смысл - ты во-первых фиксируешь значение в переменной и всегда при отладке можешь в неё глянуть, во вторых разносишь по разным строкам разные операции "вычитать значение из контрола" и "занести значение в параметp".

для отладки помогает - разделяй и властвуй.
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39140687
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Впрочем в том же UIB сделано правильно

(TParam/TField).AsDateTime : TDateTime==double
(TParam/TField).AsDate : word



Хочешь или нет - будешь транковать
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39140688
offsites
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Многое перепробовал с конвертацией
asDateTime, Timestamp, пока ничего

Params.ParamByName('blabla').AsTimeStamp:=DateTimeToTimeStamp(DateTimePicker1.Date);

Идея ясна, буду биться, решу - отпишусь, спасибо.
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39140690
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
перебирать варианты подряд - это комбинаторный взрыв.

тебе нужно адресно проверить два наиболее вероятных места

AriochЦель все та же, понять выставляется ли DataType у параметра.
Если да - то как это учитывается при переводе значения в формат FB
Если нет - то почему не выставляется

После чего станет яснее что и как выправлять

Use the source, Luke!
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39140698
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
offsites
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
with dm.DSet do
begin
   Active:=False;
   SelectSQL.Text:='SELECT * FROM GET_VALUES(:PField1Integer_id, :PField2Date)';
   Prepare;
   Params.ParamByName('PField1Integer_id').AsInteger:=1;
   Params.ParamByName('PField2Date').AsDate:=DateTimePicker1.Date;
   Active:=True;
end;


Повторяю ещё раз, медленно: это правильный код и должен работать. Ты в состоянии показать
заголовок объявления процедуры и скопипастить ошибку, которую этот код (а не
отбалдовые вариации) выдаёт?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39140707
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovэто правильный код
Точнее сказать, всё-таки "валидный и работоспособный". За повторное использование
туалетной бумаги переменных надо бы по голове стучать.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39140957
offsites
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

CREATE OR ALTER PROCEDURE GET_VALUES (
PField2Date date not null,
PField1Integer_id integer not null)
returns ( ...

Ошибка:

dm.DSet.SelectQuery:
Incompatible column/host variable data type.
Dynamic SQL Error.
SQL error code = -303.
Conversion error from string "31-DEC-2015".
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39140960
Граур Станислав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
offsites
Код: sql
1.
2.
3.
4.
CREATE OR ALTER PROCEDURE GET_VALUES (
    PField2Date date not null,
    PField1Integer_id integer not null)
returns ( ...




Несколько ранее

offsites
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  
  with dm.DSet do
  begin
    Active:=False;
--->>>>  SelectSQL.Text:='SELECT * FROM GET_VALUES(:PField1Integer_id, :PField2Date)';
    Prepare;
    Params.ParamByName('PField1Integer_id').AsInteger:=1;
    Params.ParamByName('PField2Date').AsDate:=DateTimePicker1.Date;
    Active:=True;
  end;




Порядок параметров в процедуре то data, integer, то потом integer, data

P.S.
Никогда не пользуйся кнопкой src в редакторе.
Нехай сообщество глаза ломает глядя на неотфомартированный текст.
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39141024
offsites
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Граур Станислав,

Да, дело было в порядке, спасибо, все работает!
И предположить не мог что имена переменных играют второстепенную роль.
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39141027
offsites
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хотя да, подумав понял что ступил сильно. Так ведь во всех процедурах и функциях, порядок нужен ))
Чет рассматривал ХП в отрыве от этого (спешка ))) ), решил что нужно просто свалить все переменные туда, а он сам разберется )
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39141056
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
offsites,
не припомню ЯП, где можно было бы сваливать параметры как попало. Даже в интерпретируемых ЯП оно как соответствие именам параметров должно определять? А уж в компилируемых ЯП (и psql FB) тем более, никак, там просто четкая последовательность.
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39141083
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
offsites,

В SQL вообще нет имен переменных, все параметры меняются на знак вопроса

http://datasql.ru/proektbd/5.htm
https://msdn.microsoft.com/ru-ru/library/ms140355.aspx

Как в общем и почти во всех языках, кроме некоторых скриптовых типа VBA

PS. в FIB+ разве не показывается чистый код SQL-запроса, безз Дельфийский заморочек? В UIB есть свойство ParsedSQL
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39141084
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,

VBA - именованые параметры, можно вообще указать только один из десяти
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39141088
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvоно как соответствие именам параметров должно определять?

а ровно так же как в SQL

вот смотри сам

INSERT xxxxx VALUES (1,2,3,4,5)

или

INSERT xxxxx SELECT 1,2,3,4,5 FROM rdb$database

вот тебе позиционные безымянные параметры

а теперь

UPDATE xxx SET name1=value1, name2=value2, name3=value3

Вот тебе беспозиционные именованные
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39141091
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochВот тебе беспозиционные именованные
это тебе так кажется. Т.е. если взять просто запрос (не в процедуре или триггере)
Код: sql
1.
UPDATE xxx SET name1=:param1, name2=:param2, name3=:param3


то они как раз исключительно позиционные. А по именам их разбирают (если могут) компоненты или драйверы.

p.s. и вообще я говорил про параметры процедур, о чем упоминал автор топика.
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39141413
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги, амбисните темному, вот написано, DS пишет, что оно правильно:

Params.ParamByName('PField1Integer_id').AsInteger:=1;
Params.ParamByName('PField2Date').AsDate:=DateTimePicker1.Date;

моя всю жисть писал так:

ParamByName('PField1Integer_id').AsInteger:=1;
ParamByName('PField2Date').AsDate:=DateTimePicker1.Date;

И у меня оно таки работало.
Я пропустил чего-то интересное?
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39141449
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_PisarevskyИ у меня оно таки работало.
Я пропустил чего-то интересное?
Какая разница? Кому как удобней, тот так и пишет. Не бери в голову! ;)

Мне, к примеру, нравится так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
  static const char sql__treeSelectChildren[] = "\
SELECT \"id\", \"name\"\r\n\
  FROM \"tree\"\r\n\
  WHERE \"node_id\" = :\"node_id\"";

  struct INITIALIZER
  {
    TFIBXSQLVAR * NodeId;
    TFIBXSQLVAR * Id;
    TFIBXSQLVAR * Name;

    __INLINE
    __fastcall INITIALIZER(void)
    {
      std::memset(this, 0, sizeof(INITIALIZER));
    }
    
  };

  INITIALIZER src;
  Fibquery::TFIBQuery * qry;
  try
  {
    qry = Pfibcachequeries::GetQueryForUse(tran, sql__treeSelectChildren);
    if (!qry->Prepared)
    {
      qry->Options << qoNoForceIsNull;
      qry->GoToFirstRecordOnExecute = true;
      qry->Prepare();
    }
    src.NodeId = qry->ParamByName("node_id");
    src.Id     = qry->FieldByName("id");
    src.Name   = qry->FieldByName("name");
    src.NodeId->Value = ((TREE::FIELDS&)node).id;
    qry->ExecQuery();
    if (qry->AllRowsAffected.Selects)
    {
      .
      .
      .
    }



И никто меня не убедит в том, что использовать 3-й диалект с названиями объектов БД в нижнем регистре и в двойных кавычках - это плохо.
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39141450
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_PisarevskyDS пишет, что оно правильно
Во-первых, я не заметил Params.
Во-вторых, позже я поправился на "валидный и работоспособный".
В-третьих, некоторые наборы компонент действительно имеют ParamByName только в Params.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Передача даты как параметра в хранимую процедуру
    #39141480
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

А некоторые имеют и то и другое. Плюс еще к примеру вот такое:

ParamValues['my_param']:=12345;
...
Рейтинг: 0 / 0
40 сообщений из 40, показаны все 2 страниц
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Передача даты как параметра в хранимую процедуру
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]