powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / FireDAC - вызов хранимки через TFDStoredProc
15 сообщений из 15, страница 1 из 1
FireDAC - вызов хранимки через TFDStoredProc
    #40094449
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
FireDAC - вызов хранимки через TFDStoredProc
    #40094491
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Слева лог FireDac для процедуры "@LLPA02.SPGIS01", справа для "LLPA02.SPGIS01".

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

Это какой-то спецсимвол? На что менять?
...
Рейтинг: 0 / 0
FireDAC - вызов хранимки через TFDStoredProc
    #40094493
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если делаю 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
FireDAC - вызов хранимки через TFDStoredProc
    #40094496
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мда. В общем надо так:

StoredProcName:='"@LLPA02"."SPGIS01"';
...
Рейтинг: 0 / 0
FireDAC - вызов хранимки через TFDStoredProc
    #40094659
CawaSPb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
FireDAC - вызов хранимки через TFDStoredProc
    #40094709
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CawaSPb,

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

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

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

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

Спасибо.
...
Рейтинг: 0 / 0
FireDAC - вызов хранимки через TFDStoredProc
    #40094884
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему 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
FireDAC - вызов хранимки через TFDStoredProc
    #40094889
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В рантайме не работает, а визуально - работает...
...
Рейтинг: 0 / 0
FireDAC - вызов хранимки через TFDStoredProc
    #40094896
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
FireDAC - вызов хранимки через TFDStoredProc
    #40094897
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опять разговор сам с собой....

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

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

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

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


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