Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / FireDAC - вызов хранимки через TFDStoredProc / 15 сообщений из 15, страница 1 из 1
01.09.2021, 15:44
    #40094449
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC - вызов хранимки через TFDStoredProc
IBM DB2.

Код: pascal
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.
    Proc:=TFDStoredProc.Create(DBC.FDCN);
    try
      Proc.Connection:=DBC.FDCN;
      Proc.StoredProcName:='@LLPA02.SPGIS01';
      Proc.FetchOptions.Items:=Proc.FetchOptions.Items-[fiMeta];
      with Proc.Params do begin
        Clear;
        with Add do begin
          Name := 'W1';
          ParamType := ptInput;
          DataType := ftString;
          Size := 8;
        end;
        with Add do begin
          Name := 'W2';
          ParamType := ptInput;
          DataType := ftString;
          Size := 2;
        end;
        with Add do begin
          Name := 'P1';
          ParamType := ptOutput;
          DataType := ftSmallint;
          Size := 8;
        end;
        with Add do begin
          Name := 'P1';
          ParamType := ptOutput;
          DataType := ftInteger;
          Size := 2;
        end;
      end;
      Proc.Params[0].AsString:= ...
      Proc.Params[1].AsString:= ...
      Proc.ExecProc;


Если ставишь StoredProcName:='LLPA02.SPGIS01' - ругается на нехватку прав. Но это нормально.
Есть процедура @LLPA02.SPGIS01. На нее права есть, но если указать с @ ругается:
[FireDAC][Phys][ODBC][IBM][CLI Driver] CLI0118E Invalid SQL syntax. SQLSTATE=37000

StoredProcName:='"@LLPA02.SPGIS01"' - выдает:
[FireDAC][Phys][ODBC][IBM][CLI Driver][DB2] SQL1097N The node name was not found in the node directory. SQLSTATE=42705

Вызов через FDQuery в виде "CALL @LLPA02.SPGIS01('02817237','28',0,0);" - работает.

Аналогичный код на шапре работает:
Код: c#
1.
2.
3.
4.
5.
6.
7.
                        IDbDataParameter p1, p2;
                        var result = connection.ExecuteStoredProcedure(""@LLPA02.SPGIS01"",
                                                                       SSDB.P("W1", SSDBType.Char, size: 8, value: number),
                                                                       SSDB.P("W2", SSDBType.Char, size: 2, value: road),
                                                                       p1 = SSDB.P("P1", SSDBType.Short, direction: ParameterDirection.InputOutput),
                                                                       p2 = SSDB.P("P2", SSDBType.Int, direction: ParameterDirection.InputOutput));
                        res = (SpGisResult)(short)p1.Value;



Что я делаю не так?
...
Рейтинг: 0 / 0
01.09.2021, 16:53
    #40094491
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC - вызов хранимки через TFDStoredProc
Слева лог FireDac для процедуры "@LLPA02.SPGIS01", справа для "LLPA02.SPGIS01".

Какого фига теряется имя процедуры в вызове?!

Это какой-то спецсимвол? На что менять?
...
Рейтинг: 0 / 0
01.09.2021, 16:59
    #40094493
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC - вызов хранимки через TFDStoredProc
Если делаю StoredProcName:='"@LLPA02.SPGIS01"' то эта собака добавляет еще и префикс с юзером! Сама!

Код: plaintext
1.
2.
3.
1967762650001 16:57:06.295          . ENTER SQLPrepareW 
		HSTMT               0x01AE6DD0
		WCHAR *             0x03337C1C [      -3] "{CALL "DGLN0006"."@LLPA02.SPGIS01"(?, ?, ?, ?)}\ 0"
		SDWORD                    -3

И так тоже работать не будет!

Р-р-р-р!
...
Рейтинг: 0 / 0
01.09.2021, 17:06
    #40094496
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC - вызов хранимки через TFDStoredProc
Мда. В общем надо так:

StoredProcName:='"@LLPA02"."SPGIS01"';
...
Рейтинг: 0 / 0
02.09.2021, 04:00
    #40094659
CawaSPb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC - вызов хранимки через TFDStoredProc
rgreat
Мда. В общем надо так:

StoredProcName:='"@LLPA02"."SPGIS01"';

Случайно набрёл.
Да, в именах объектов и схемах могут быть спец. символы, кириллица, национальные символы других языков, пробелы, переводы строк, точки и вообще, чуть не весь Unicode. Смотреть лень, есть ли исключения.
Но если используете что-то кроме английских символов из набора ASCII, "_" и цифр, крайне желательно заквотить.
И да, конечно же, имя схемы и объекта квотятся по-отдельности.

@ - часто используется как альтернативный "statement terminator" в ситуациях, где есть compound SQL (чтобы отличить от внутренних ";") Как-то с DB2 такая практика сложилась.

Вы, кстати, с DB2 на какой платформе работаете?
Про DB2 for LUW я бы сказал, что в этой ситуации "SQL1097N The node name was not found in the node directory. SQLSTATE=42705" - очень странная диагностика.
...
Рейтинг: 0 / 0
02.09.2021, 10:24
    #40094709
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC - вызов хранимки через TFDStoredProc
CawaSPb,

В данном случае майнфрейм, OS390 или что-то в этом роде, кажись.
...
Рейтинг: 0 / 0
02.09.2021, 10:49
    #40094730
CawaSPb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC - вызов хранимки через TFDStoredProc
rgreat
В данном случае майнфрейм, OS390 или что-то в этом роде, кажись.

Ага. Там "схема" и "нода" могут быть понятиями пересекающимися. Не в курсе.

С квотированием же ситуация схожа с Db2 for LUW (SQL IBM стремится унифицировать, где может).

Будут проблемы, риходите в IBM DB2, WebSphere, IMS, U2, etc , там наверняка помогут.
...
Рейтинг: 0 / 0
02.09.2021, 11:25
    #40094749
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC - вызов хранимки через TFDStoredProc
CawaSPb,

Спасибо.
...
Рейтинг: 0 / 0
02.09.2021, 17:30
    #40094884
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC - вызов хранимки через TFDStoredProc
Почему TFDStoredProc может не возвращать рекордсет, при том выполняясь и возвращая параметры?

Код: pascal
1.
2.
3.
4.
5.
6.
      Proc.ExecProc;

      case TProcRes(Proc.Params[2].AsInteger) of
        Ok          : begin
          if Proc.RecordCount=1 then begin
            Id:=Proc.Fields[0].AsInteger;



RecordCount всегда 0.
Кол-во полей в нем - тоже 0.

Что-то я в примерах не вижу ни одного образца того как из с помощью TFDStoredProc получают рекордсеты...

Вроде как оно само должно, но нет...
...
Рейтинг: 0 / 0
02.09.2021, 17:52
    #40094889
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC - вызов хранимки через TFDStoredProc
В рантайме не работает, а визуально - работает...
...
Рейтинг: 0 / 0
02.09.2021, 18:12
    #40094896
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC - вызов хранимки через TFDStoredProc
...
Рейтинг: 0 / 0
02.09.2021, 18:14
    #40094897
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC - вызов хранимки через TFDStoredProc
Опять разговор сам с собой....

После Proc.ExecProc; надо еще и Proc.Active:=True;

Логично блин! (На самом деле - нет).
...
Рейтинг: 0 / 0
02.09.2021, 18:33
    #40094905
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC - вызов хранимки через TFDStoredProc
rgreat
После Proc.ExecProc; надо еще и Proc.Active:=True;
Замени все на Open
...
Рейтинг: 0 / 0
02.09.2021, 18:44
    #40094911
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC - вызов хранимки через TFDStoredProc
_Vasilisk_,

Угу, спасибо.
...
Рейтинг: 0 / 0
02.09.2021, 19:40
    #40094924
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FireDAC - вызов хранимки через TFDStoredProc
rgreat,

Как бы Execute (ExecProc) - оно для того, чтобы дернуть процедуру, которая ничего не возвращает. А Open - для того, чтобы из нее что-то вернуть. Ну это так - мысли вслух...
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / FireDAC - вызов хранимки через TFDStoredProc / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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