powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle Forms [игнор отключен] [закрыт для гостей] / Вложенный запрос в Oracle Forms
8 сообщений из 8, страница 1 из 1
Вложенный запрос в Oracle Forms
    #35932378
UncleFox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
День добрый!

В OF6 понадобилось получить данные с помощью запроса вида:
SELECT country_cod, country_name INTO tmp_country_cod, tmp_country_name FROM
(SELECT ROW_NUMBER() OVER (ORDER BY country_name ASC) AS country_id, country_name, country_cod FROM country)
WHERE country_id = TO_NUMBER(InCode);
при компиляции ругается:
Encountered the symbol "(" when expecting one of the following: , from

попробовал сделать иначе:
SELECT country_name, country_cod INTO tmp_country_cod, tmp_country_name
FROM (SELECT ROWNUM rn, t.*
FROM (SELECT country_name, country_cod FROM country ORDER BY country_name) t
WHERE ROWNUM <= TO_NUMBER(InCode)) t
WHERE rn = TO_NUMBER(InCode);
при компиляции ругается:
Encountered the symbol "ORDER" when expecting one of the following:
. ( * @ % & = - ............

В TOAD оба работают без проблем. Каим образом можно извратиться и вставить таки запрос в форму (запрос на сервере не интересует).
...
Рейтинг: 0 / 0
Вложенный запрос в Oracle Forms
    #35932395
Фотография dmidek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сильно предполагаю, что проблема в невозможности использования аналитики и
т.д. на шестом клиенте.

Вариант решения по моему очевиден - переносите запрос в процедуру на сервер,
вызывая ее из Формс.
...
Рейтинг: 0 / 0
Вложенный запрос в Oracle Forms
    #35932417
Всегда!!!!!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UncleFox,

PL/SQL машина встроенная в Forms 6 понимает только SQL от Oracle 8.
Поэтому попытка что-то сделать с аналитическими функциями не прокатит.

Не зная постановки задачи и ограничений - самый правильный способ тот, который тебя не интересует.

Также можно попробовать динамический SQL на клиенте (пакет EXEC_SQL, аналог серверного DBMS_SQL)
...
Рейтинг: 0 / 0
Вложенный запрос в Oracle Forms
    #35932418
tru55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dmidek
т.д. на шестом клиенте.

Кляйне поправка - на клиенте 8.0 :)
...
Рейтинг: 0 / 0
Вложенный запрос в Oracle Forms
    #35932583
UncleFox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так, с аналитическими всё понятно.
А чем ему во втором варианте запроса ORDER BY не понравился?
...
Рейтинг: 0 / 0
Вложенный запрос в Oracle Forms
    #35932591
Фотография dmidek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UncleFoxТак, с аналитическими всё понятно.
А чем ему во втором варианте запроса ORDER BY не понравился?

Тем же . В восьмерке ORDER BY в подзапросе невозможен.
...
Рейтинг: 0 / 0
Вложенный запрос в Oracle Forms
    #36562439
Деев И.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как-то меня эта проблема с несовместимостью забодала, написал процедурку для создания скрипта, выполняющего запрос через динамический SQL. На вход подается запрос. Правда, bind-переменные потом ручками надо подставлять, но это мелочи.
Код: 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.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
create or replace procedure use_dsql(i_sql in varchar2, i_exec in number:= 0 ) is
  c number;
  d number;
  col_cnt integer;
  rec_tab dbms_sql.desc_tab;
  col_num number;
  l_k_vc2_len number :=  1 ;
  l_res_cnt number :=  0 ;
  l_info_result varchar2( 32000 );
  l_string varchar2( 2000 );
  l_number number;
  l_date date;
  l_cur number;
  l_exe number;
begin
  if substr(sys_context('USERENV','LANGUAGE'),instr(sys_context('USERENV','LANGUAGE'),'.')+ 1 ) = 'AL32UTF8' then 
    l_k_vc2_len:= 0 . 25 ;
  end if;  
  -- формирование скрипта для вывода запроса через DBMS_SQL
  c := dbms_sql.open_cursor;
  dbms_sql.parse(c, i_sql,  1 );

  dbms_output.put_line('declare');
  dbms_output.put_line('  l_cur number;');
  dbms_output.put_line('  l_exe number;');
  dbms_output.put_line('  type q_rec is record (');
  dbms_sql.describe_columns(c, col_cnt, rec_tab);
  
  col_num := rec_tab.first;
  if (col_num is not null) then
    loop
     dbms_output.put('  '||rec_tab(col_num).col_name||' '||case rec_tab(col_num).col_type when  1  then 'VARCHAR2('||to_char(rec_tab(col_num).col_max_len*l_k_vc2_len)||' CHAR)' when  2  then 'NUMBER' when  12  then 'DATE' else 'VARCHAR2(2000 CHAR)' end);
     col_num := rec_tab.next(col_num);
     exit when (col_num is null);
     dbms_output.put_line(',');
    end loop;
    dbms_output.put_line(');');
  end if;
  dbms_output.put_line('  l_rec q_rec;');
  print('  l_sql varchar2(32767):= '''||replace(i_sql,'''','''''')||''';');

  dbms_output.put_line('begin');
  dbms_output.put_line('  l_cur:=dbms_sql.open_cursor;');
  dbms_output.put_line('  dbms_sql.parse(l_cur,l_sql,1);');

  col_num := rec_tab.first;
  if (col_num is not null) then
    loop
      dbms_output.put_line('  dbms_sql.define_column(l_cur,'||to_char(col_num)||', l_rec.'||rec_tab(col_num).col_name||
      case rec_tab(col_num).col_type when  1  then ','||to_char(rec_tab(col_num).col_max_len*l_k_vc2_len) 
                                     when  2  then ''
                                     when  12  then ''
                                     else ', 2000 CHAR' end ||');');
        col_num := rec_tab.next(col_num);
        exit when (col_num is null);
    end loop;
  end if;
  dbms_output.put_line('  -- bind variables --');
  dbms_output.put_line('  -- dbms_sql.bind_variable(l_cur,'''||'<bind>'||''',<val>);');

  dbms_output.put_line('  l_exe:=dbms_sql.execute(l_cur);');
  dbms_output.put_line('  while dbms_sql.fetch_rows(l_cur)<>0 loop');

  col_num := rec_tab.first;
  if (col_num is not null) then
    loop
      dbms_output.put_line('    dbms_sql.column_value(l_cur,'||to_char(col_num)||',l_rec.'||rec_tab(col_num).col_name||');');
      col_num := rec_tab.next(col_num);
      exit when (col_num is null);
    end loop;
  end if;

  col_num := rec_tab.first;
  if (col_num is not null) then
    dbms_output.put_line('    --- values ---');
    dbms_output.put_line('    dbms_output.put_line(');
    loop
      dbms_output.put('    l_rec.'||rec_tab(col_num).col_name||'||'';''');
      col_num := rec_tab.next(col_num);
      exit when (col_num is null);
      dbms_output.put_line('||');
    end loop;
    dbms_output.put_line(');');
  end if;
  dbms_output.put_line('  end loop;');
  dbms_output.put_line('  dbms_sql.close_cursor(l_cur);');
  dbms_output.put_line('end;');
  dbms_sql.close_cursor(c);
  if i_exec =  0  then 
    return;
  end if;
  -- вывод результатов запроса
  dbms_output.put_line('');
  c := dbms_sql.open_cursor;
  dbms_sql.parse(c, i_sql,  1 );
  d := dbms_sql.execute(c);
  
  dbms_sql.describe_columns(c, col_cnt, rec_tab);
  col_num := rec_tab.first;
  if (col_num is not null) then
    loop
      l_info_result:=l_info_result||rec_tab(col_num).col_name||'; ';
      if rec_tab(col_num).col_type =  1  then 
        DBMS_SQL.define_COLUMN(c, col_num, 'l_string',  2000 );
      elsif rec_tab(col_num).col_type =  2  then  
        DBMS_SQL.define_COLUMN(c, col_num,  1 );    
      elsif rec_tab(col_num).col_type =  12  then 
        DBMS_SQL.define_COLUMN(c, col_num, sysdate); 
      end if;
      col_num := rec_tab.next(col_num);
      exit when (col_num is null);    
    end loop;
  end if;
  print(l_info_result);
  l_info_result := '';
  loop
    d := dbms_sql.fetch_rows(c);
    exit when d =  0  or l_res_cnt >  20 ;
    l_res_cnt := l_res_cnt +  1 ;
    l_info_result:=l_info_result;--||chr(10);
      for i in  1 ..rec_tab.count loop
        if rec_tab(i).col_type =  1  then 
          dbms_sql.column_value(c, i, l_string);
          l_info_result:=l_info_result||l_string||'; ';
        elsif rec_tab(i).col_type =  2  then 
          dbms_sql.column_value(c, i, l_number);
          l_info_result:=l_info_result||l_number||'; ';
        elsif rec_tab(i).col_type =  12  then 
          dbms_sql.column_value(c, i, l_date);
          l_info_result:=l_info_result||to_char(l_date,'dd.mm.yyyy hh24:mi:ss')||'; ';
        end if;  
        dbms_output.put(l_info_result);
        l_info_result :='';
      end loop;
      dbms_output.put_line('');
  end loop;
end;
...
Рейтинг: 0 / 0
Вложенный запрос в Oracle Forms
    #36562485
efendi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если ожидаемых данных не много, можно использовать группу...
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Oracle Forms [игнор отключен] [закрыт для гостей] / Вложенный запрос в Oracle Forms
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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