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

В 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
15.04.2009, 10:41
    #35932395
dmidek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос в Oracle Forms
Сильно предполагаю, что проблема в невозможности использования аналитики и
т.д. на шестом клиенте.

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

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

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

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

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

Тем же . В восьмерке ORDER BY в подзапросе невозможен.
...
Рейтинг: 0 / 0
06.04.2010, 09:28
    #36562439
Деев И.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос в Oracle Forms
Как-то меня эта проблема с несовместимостью забодала, написал процедурку для создания скрипта, выполняющего запрос через динамический 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
06.04.2010, 09:46
    #36562485
efendi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос в Oracle Forms
Если ожидаемых данных не много, можно использовать группу...
...
Рейтинг: 0 / 0
Форумы / Oracle Forms [игнор отключен] [закрыт для гостей] / Вложенный запрос в Oracle Forms / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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