powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Сотавление SQL запроса insert и readonly-поля
9 сообщений из 9, страница 1 из 1
Сотавление SQL запроса insert и readonly-поля
    #39550400
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Процедура (Delphi) составляет в цикле запрос "UPDATE OR INSERT INTO ...."
Как понять/определить, что то или иной поле является readonly?

Я вижу, что FibPlus умеет генерировать правильный запрос, где нет вычисляемых полей, где нет полей, которые "пришли" из JOIN таблицы.

Чтобы было понятнее. Есть запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT
    A.ID,
    A.INPUT_DATE,
    A.LCD,
    T.NAME TYPE_NAME,
    A.PHONES_LIST /* вычисляемое */
FROM
    APART A
    LEFT JOIN TYPES T ON A.ID_TYPE = T.ID



FibPlus генерирует:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
INSERT INTO APART(
    ID,
    INPUT_DATE,
    LCD
)
VALUES(
    :ID,
    :INPUT_DATE,
    :LCD
)


Нет полей TYPE_NAME и PHONES_LIST.

Но у меня нет первичного SQL запроса, т.к. я выполняю импорт из XML файла. В XML файле набор всех полей, в том числе и TYPE_NAME, и PHONES_LIST.
И вот нужно как-то понять/определить, что TYPE_NAME и PHONES_LIST импортировать не надо.
Доступ к базе, куда нужно импортировать данные, у программы есть.

Firebird 2.5
...
Рейтинг: 0 / 0
Сотавление SQL запроса insert и readonly-поля
    #39550411
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

вычитать из базы структуру таблицы
и сравнить поля не предлагать?
...
Рейтинг: 0 / 0
Сотавление SQL запроса insert и readonly-поля
    #39550415
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну почему не предлагать?
А как понять, что поле не просто присутствует, но оно только для чтения?
В таблице есть поле, например, PHONES_LIST, но оно вычисляемое.
...
Рейтинг: 0 / 0
Сотавление SQL запроса insert и readonly-поля
    #39550430
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Ну почему не предлагать?
А как понять, что поле не просто присутствует, но оно только для чтения?
В таблице есть поле, например, PHONES_LIST, но оно вычисляемое.
Это подтянутся более знающие и подскажут

зы. насколько я помню
RDB$FIELDS.RDB$COMPUTED_SOURCE
но возможно я и ошибаюсь
...
Рейтинг: 0 / 0
Сотавление SQL запроса insert и readonly-поля
    #39550466
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Я вижу, что FibPlus умеет генерировать правильный запросфибы идут в исходниках, глянь как они это делают.
...
Рейтинг: 0 / 0
Сотавление SQL запроса insert и readonly-поля
    #39550947
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Там черт ногу сломит
...
Рейтинг: 0 / 0
Сотавление SQL запроса insert и readonly-поля
    #39550951
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я нешёл RDB$RELATION_FIELDS. RDB$UPDATE_FLAG
...
Рейтинг: 0 / 0
Сотавление SQL запроса insert и readonly-поля
    #39550970
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11FROM APART A LEFT JOIN TYPES T ON A.ID_TYPE = T.ID

Беда в том, что select - слишком гибкий инструмент.
Он может читать данные из таблиц, из вьюх, из процедур, из внешних таблиц и т.д.
Кроме столбцов там могут быть выражения, подзапросы и т.д.

Причем приложение часто не знает откуда какое значение приползёт, на какие объекты БД будетс сылаться запрос (выше "TYPES T" - это что, таблица, вьюха, процедура? запрос этого не знает и знать не может, только сервер)

Короче, IMHO, надо запросу делать Prepare и когда сервер вернет подготовленные данные (информацию как создавать и разбирать буферы в памяит для чтения строк) - уже в этом ответе смотреть где там что, где обновляемое, а где read-only.
...
Рейтинг: 0 / 0
Сотавление SQL запроса insert и readonly-поля
    #39551294
Коваленко Дмитрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m7mX11Ну почему не предлагать?
А как понять, что поле не просто присутствует, но оно только для чтения?
В таблице есть поле, например, PHONES_LIST, но оно вычисляемое.
Это подтянутся более знающие и подскажут

зы. насколько я помню
RDB$FIELDS.RDB$COMPUTED_SOURCE
но возможно я и ошибаюсь

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
extern const wchar_t* const ib_sys_query_get_updatable_columns=
  L"select rf.rdb$field_name as field_name\n"
  L"from rdb$relation_fields rf\n"
         L"join rdb$fields f\n"
         L"on rf.rdb$field_source=f.rdb$field_name\n"
  L"where rf.rdb$relation_name=? and\n"
        L"(f.rdb$computed_blr is NULL)";
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Сотавление SQL запроса insert и readonly-поля
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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