Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Копирование записей. / 15 сообщений из 15, страница 1 из 1
27.05.2016, 10:36
    #39244619
drodman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование записей.
Доброго дня и хорошей пятницы уважаемые гуру "ЖарПтицеводы" ))

Подобной темы не нашел, поэтому постараюсь правильно описасть суть решения которое хотелось бы получить.

Есть таблица с 50 полями но в дальнейчем число полей будет меняться, в ней присутствуют PI и FK ключами.
Хочу сделать копиию одной из записи данной таблицы но при изменить всего лишь 3 поля. И самое сложное сделать это с динамически изменющимся количеством полей. Никто не сталкивался с подобной задачей в ХП или триггерах, если сталкивались то прошу поделиться опытом.

Таблица:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE TABLE TBL1 (
    ID                INTEGER NOT NULL,
    FIELD1         VARCHAR(15) CHARACTER SET WIN1251,
    FIELD2         VARCHAR(10) CHARACTER SET WIN1251,
    FIELD3         VARCHAR(15) CHARACTER SET WIN1251,
    FIELD4         INTEGER,
    FIELD5         DATE,
    FIELD6         DOUBLE PRECISION,
    ...
    FIELD50        DOUBLE PRECISION,
);
...
Рейтинг: 0 / 0
27.05.2016, 10:48
    #39244645
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование записей.
Hello, Drodman!
You wrote on 27 мая 2016 г. 10:47:58:

Drodman> самое сложное сделать это с динамически изменющимся количеством полей
ну так и формируй запрос динамически.
если внутри процедуры, или триггера, то выполняй его через EXECUTE STATEMENT
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
27.05.2016, 10:57
    #39244655
drodman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование записей.
Я прошу прощения просто не совсем доконца понимаю. Если не сложно подправьте в случае надобности.
т.е. мне нужно сделать примерно такую процедуру:
Код: plsql
1.
2.
insert into tbl1 values 
select (gen_id(idgen, 1), execute statement (ЗАПРОС ВЫДАЮЩИЙ СПИСОК ПОЛЕЙ ТАБЛИЦЫ (всех, кроме ID) )
...
Рейтинг: 0 / 0
27.05.2016, 11:05
    #39244663
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование записей.
drodman,

нет конечно. EXECUTE STATEMENT это отдельный оператор, его нельзя включать в DML инструкции.
...
Рейтинг: 0 / 0
27.05.2016, 11:05
    #39244664
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование записей.
нет уж.
дальше сам.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
27.05.2016, 11:07
    #39244667
drodman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование записей.
Большое спасибо. Очень помогли.
...
Рейтинг: 0 / 0
27.05.2016, 11:26
    #39244692
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование записей.
drodman, в общих чертах это делается так:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
EXECUTE BLOCK
AS
  DECLARE VARIABLE sql VARCHAR(32765) DEFAULT 'INSERT INTO TBL1 (ID, ';
  DECLARE VARIABLE cnt SMALLINT DEFAULT 1;
BEGIN
  WHILE (cnt < 10) DO
    BEGIN
      sql = sql || 'FIELD' || cnt || ', ';
      cnt = cnt + 1;
    END
  sql = sql || 'FIELD' || cnt || ') VALUES (';
  cnt = 1;
  WHILE (cnt < 10) DO
    BEGIN
      -- здесь соединением строк пихаем значения полей
      .
      .
      .

  sql = sql || ')'
  EXECUTE STATEMENT sql;
END
...
Рейтинг: 0 / 0
27.05.2016, 11:52
    #39244725
drodman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование записей.
rdb_dev, Огромное спасибо!
...
Рейтинг: 0 / 0
27.05.2016, 11:59
    #39244736
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование записей.
drodmanЕсть таблица с 50 полями но в дальнейчем число полей будет меняться.
Хочу сделать копиию одной из записи данной таблицы но при изменить всего лишь 3 поля. И
самое сложное сделать это с динамически изменющимся количеством полей.
И что в этом сложного? Тот, кто меняет количество полей, пусть меняет и процедуру копирования.

PS: Предлагать нанять архитектора БД чтобы спроектировал нормальную базу вместо этого
....... - не буду.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
27.05.2016, 12:03
    #39244741
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование записей.
drodman FIELD1 VARCHAR(15) CHARACTER SET WIN1251,
комментарий в сторону. Обычно при экспорте ddl из какой-нибудь тулзы (isql, ibexpert), набор символов для строковых столбцов выводится только в том случае, если он отличается от дефолтного для БД. Следовательно, у вас в rdb$database.rdb$character_set_name может быть пусто, и при случайном коннекте без win1251 и создании таблиц или добавлении столбцов строковые столбцы создадутся в этом самом чарсете, т.е. none (или не win1251).

Рекомендую проверить эту ситуацию, и исправить.
...
Рейтинг: 0 / 0
27.05.2016, 16:02
    #39245060
drodman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование записей.
kdv, спасибо, да дейстивтельно база лежит на сервере unix с кодировкой UTF-8, поэтому приходится в "тулзах" прописывать кодировку.
...
Рейтинг: 0 / 0
27.05.2016, 16:04
    #39245063
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование записей.
drodmanбаза лежит на сервере unix с кодировкой UTF-8, поэтому приходится в "тулзах"
прописывать кодировку.
"Аффтар жжот!" (с)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
27.05.2016, 17:26
    #39245191
Ivan_Pisarevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование записей.
drodmanбаза лежит на сервере unix с кодировкой UTF-8, поэтому приходится
CHARACTER SET WIN1251Отгоните от сервера диверсанта, пока он все не переломал.

ТАК делать не надо. Если твоя клиентская часть в силу своей древности не понимает юникод, то укажи в строке коннекта, что ты хочешь получать вин1251, сервер тебе перекодирует, когда будет отдавать твоему клиенту данные. Делать пол базы в юникоде, половину в вин1251 в буквальном смысле "выстрел себе в ногу".
...
Рейтинг: 0 / 0
27.05.2016, 17:29
    #39245196
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование записей.
Ivan_PisarevskyДелать пол базы в юникоде, половину в вин1251 в буквальном смысле
"выстрел себе в ногу".
Да в общем-то пофиг, пока в DPB есть вменяемое значение isc_dpb_lc_ctype...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
27.05.2016, 17:33
    #39245207
Ivan_Pisarevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование записей.
Dimitry SibiryakovДа в общем-то пофигПока немчура с умляутами или китайцы с иероглифами не подтянутся.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Копирование записей. / 15 сообщений из 15, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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