Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вопрос по SQL запросу / 5 сообщений из 5, страница 1 из 1
14.12.2014, 01:14
    #38833297
Aina2008
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по SQL запросу
Здорова товарищи,

есть следующий запрос:

Код: plsql
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.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
execute block (table_name varchar(150), 
		user_nm varchar(50), 
		user_psw varchar(50))

   returns (sql_insert varchar(5000), sql_update varchar(5000))
as
   declare variable fname varchar(100);
   declare variable pars varchar(5000);
   declare variable upd_whr varchar(255);
   declare variable set_ varchar(5000);
   declare variable i integer;
   declare variable field_name_id varchar(50);
begin

sql_insert = 'insert into ' || :table_name || ' (';
sql_update = 'update '|| :table_name ||' set ';
pars = 'values (';
upd_whr = 'where ';
set_ = '';
i = 0;
field_name_id = '';

for execute statement 'select TRIM(RDB$FIELD_NAME) from RDB$RELATION_FIELDS where RDB$RELATION_NAME = ' || :table_name ||' order by RDB$FIELD_POSITION ASC'
on external 'D:\MyProgramm\Replication\data\MFC.FDB'
as user :user_nm password :user_psw
into :fname
do begin
  sql_insert = sql_insert || :fname || ', ';
   pars = pars || ':' || :fname || ', ';

   if (:i = 0) then
     begin
       field_name_id = :fname;
       i = :i + 1;
    end
   else
    set_ = :set_ || :fname || ' = ' || ':' || :fname || ', ';

 end

   sql_insert = trim(', ' from :sql_insert);
   pars = trim(', ' from :pars);

   set_ = trim(', ' from :set_);

   sql_insert = :sql_insert || ') ' || :pars || ')';

    sql_update = :sql_update || :set_ || ' ' || :upd_whr || ' ' || :field_name_id || ' = :' || :field_name_id;

   suspend;
end



в этом блоке формируется два sql запроса (insert и update), для таблицы которую мы укажем.

Теперь когда я обращаюсь к таблице, указанной в переменной table_name

я вытаскиваю с помощью select записи.

мне нужно следующее:

у меня формируется типа такого:


insert into <table_name> (field1, field2, .....) values (:field1, field2, .......)

update <table_name> set field1 = :field1, field2 = :field2, ...... where id = :id

теперь вопрос, как мне вместо :field1, :field2 .......

вставлять значение из запроса select.

(по идее я должен объявлять переменные и с помощью select .... into всталять их)

здесь возникат такая загвоздка, в таблицах переменного количество столбцов, соотвественно и переменных может быть разное количество

Можно ли это сделать в sql такое или нет?
...
Рейтинг: 0 / 0
14.12.2014, 01:52
    #38833300
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по SQL запросу
Aina2008теперь вопрос, как мне вместо :field1, :field2 .......
вставлять значение из запроса select.
о боже... execute block, execute statement... on external, from rdb$ !!!
А просто запрос к конкретной БД нельзя написать? Зачем эти головоломные конструкции? Я бы такого сотрудника, который пишет ЭТО, немедленно уволил.

Aina2008в таблицах переменного количество столбцов, соотвественно и переменных может быть разное количество
мысли пачкают мозги.
...
Рейтинг: 0 / 0
14.12.2014, 01:53
    #38833301
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по SQL запросу
Aina2008Можно ли это сделать в sql такое или нет?
Нет, нельзя. И вообще, фигнёй вы маетесь.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
14.12.2014, 02:02
    #38833302
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по SQL запросу
Aina2008Можно ли это сделать в sql такое или нет?Да можно, конечно :-)
Только все эти "универсальные DML" с заранее неизвестной таблицей - настораживают как-то. Откуда вы будете брать значения аргументов, все эти :field1, :field2 etc ? Вы даже не знаете их точное число...

Впрочем, забирайте:
Код: 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.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
SQL> show table tcommon;
ID                              INTEGER Not Null
F01                             VARCHAR(10) Nullable
N01                             INTEGER Nullable
D01                             TIMESTAMP Nullable
B01                             BLOB segment 80, subtype BINARY Nullable

SQL> set list on;
SQL> with recursive
CON> inp as(
CON>     select
CON>         'TCOMMON' as table_name
CON>         ,'where 1=1' as where_cond
CON>     from rdb$database
CON> )
CON> ,rf as(
CON>     select
CON>         cast( ','||trim(f.rdb$field_name) as varchar(8190)) as ins_expr
CON>         ,cast( ','||trim(f.rdb$field_name)||'=:'||trim(f.rdb$field_name) as varchar(8190)) as upd_expr
CON>         ,1 as fld_pos
CON>         ,i.table_name
CON>         ,i.where_cond
CON>     from rdb$relation_fields f
CON>     join inp i on f.rdb$relation_name = i.table_name
CON>     where f.rdb$field_position = 1
CON>
CON>     UNION ALL
CON>
CON>     select
CON>         rf.ins_expr ||','||trim(f.rdb$field_name)
CON>         ,rf.upd_expr ||','||trim(f.rdb$field_name)||'=:'||trim(f.rdb$field_name)
CON>         ,f.rdb$field_position
CON>         ,rf.table_name
CON>         ,rf.where_cond
CON>     from rf
CON>     join rdb$relation_fields f on  f.rdb$relation_name = rf.table_name and rf.fld_pos + 1 = f.rdb$field_position
CON> )
CON>
CON> , fv as(
CON>     select
CON>         ins_expr
CON>         ,replace(ins_expr, ',', ',:') val_list
CON>         ,upd_expr
CON>         ,table_name
CON>         ,where_cond
CON>     from rf
CON>     order by fld_pos desc
CON>     rows 1
CON> )
CON>
CON> select
CON>     'insert into '||table_name||' (' || substring(ins_expr from 2)
CON>     || ') values ('
CON>     || substring(val_list from 2) ||');' as ins_expr
CON>     ,'update '||table_name||' set '||substring(upd_expr from 2)||' '||where_cond||';' as upd_expr
CON> from fv;

INS_EXPR                        insert into TCOMMON (F01,N01,D01,B01) values (:F01,:N01,:D01,:B01);
UPD_EXPR                        update TCOMMON set F01=:F01,N01=:N01,D01=:D01,B01=:B01 where 1=1;
::: NB :::computed-by поля расковыривайте сами в качестве домашнего задания :-) Это запрос выдаст их в общем списке.
...
Рейтинг: 0 / 0
18.12.2014, 00:36
    #38836528
NikolayV81
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по SQL запросу
Таблоид...
SQL> with recursive
...

Теперь я знаю зачем нужы ssd новые процессоры и 3-канальные контроллеры памяти ( слышал ещё gddr5 из видеокарт предлагают в качестве кэша использовать )
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вопрос по SQL запросу / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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