Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Проблема с числовыми параметрами / 12 сообщений из 12, страница 1 из 1
10.10.2002, 08:44
    #32056905
Виктор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с числовыми параметрами
Есть тут у меня запрос типа такого:
select * from stores where id in (1, 2, 3)
и нужно в этот запрос параметр передавать, типа :
select * from stores where id in (:store)

если :store=1 , то все нормально, но если
:store=1,2 то ругается оракл 01722 Invalid number ....

Если сначала формировать строку запроса (stmt_str:='select * from stores where id in ('||store_id||')' ), а потом ее открывать (OPEN c FOR stmt_str ), всё работает. Но это в процедуре или в функции, но мне нужен просто запрос...
...
Рейтинг: 0 / 0
10.10.2002, 10:25
    #32056928
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с числовыми параметрами
Интересно, мне понравилась задачка:) Насколько знаю, параметра-массива в Оракле нет, так что на ум приходит либо предварительное наполнение pl/sql-таблицы нужными параметрами и переделка запроса для работы с ней (но это м.б. неоптимально по скорости выполнения), либа шаманство с динамическим sql со всеми вытекающими.
...
Рейтинг: 0 / 0
10.10.2002, 10:48
    #32056933
MW
MW
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с числовыми параметрами
А воспользоваться Macro (&store) ?
...
Рейтинг: 0 / 0
10.10.2002, 10:57
    #32056940
Виктор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с числовыми параметрами
2 MW:
Я использую FastReport, в нем и выполняется запрос. Macro (&store) не переваривается.
...
Рейтинг: 0 / 0
10.10.2002, 11:11
    #32056951
ora600
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с числовыми параметрами
Да и парситься будет каждый раз...Хотя, если этот запрос будет выполняться достаточно редко, то почему бы и строкой не передавать ?
Соорудите функцию на клиенте, которая из кучки чисел делает одну строку с этими числами через запятую.Только

если запрос частый, то неэффективно

если строка будет очень длинная (десятки кило)то ... кирдык :-)
...
Рейтинг: 0 / 0
10.10.2002, 11:35
    #32056961
Виктор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с числовыми параметрами
2 ora600:
Да у меня и так кучка чисел передается в запрос как строка с этими числами через запятую. Но оракл не переваривает эту строку, говорит, что неправильное число. Наверное, при разборе он смотрит, что в конструкции where id in (:store) , т.к. id - number, то и :store должен быть number. А строчку типа '1, 2, 3' к числу ему сложно преобразовать...
...
Рейтинг: 0 / 0
10.10.2002, 11:52
    #32056969
ora600
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с числовыми параметрами
Вместо :store надо '||<строка>||' или как там в FastRep, не знаю... т.е. селект и числа через запятую должны составлять единую строку. И апострофы случайно туда не поставьте
...
Рейтинг: 0 / 0
10.10.2002, 12:36
    #32056999
MW
MW
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с числовыми параметрами
В параметр :store не удастся впихнуть ничего кроме одного значения!!! (одного числа, одной строки)

2Виктор:
Конструкция where id in (&store) прекрасно понимается Ораклом. Посмотри в описание запроса для FastReport там наврняка должно быть что-то про макросы.
Как например в ODAC можно для запроса использовать метод MacroByName( 'store' )... И згнать туда то что нужно.
...
Рейтинг: 0 / 0
10.10.2002, 15:03
    #32057089
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с числовыми параметрами
Вот, наизвращался. Только все это работает на Oracle 9.2, как это делать на дболее ранних версиях- не знаю:

Код: 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.
create or replace type t_empno as object (
    empno integer
)
/
create or replace type tbl_empno as table of t_empno;
/
create or replace package pkg_test as
  function getEmp return tbl_empno;
  procedure deleteEmp;
  procedure addEmp(p_empno integer);
end;
/
create or replace package body pkg_test as

  v_empno tbl_empno := tbl_empno();

  function getEmp return tbl_empno as
  begin
    return v_empno;
  end;

  procedure deleteEmp as
  begin
    v_empno.delete;
  end;

  procedure addEmp(p_empno integer) as
  begin
    v_empno.extend;
    v_empno(v_empno.count) := t_empno(p_empno);
  end;
end;
/


А теперь собственно метод работы:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
sql> exec pkg_test.deleteEmp;

PL/SQL procedure successfully completed.

sql> exec pkg_test.addEmp( 7369 );

PL/SQL procedure successfully completed.

sql> exec pkg_test.addEmp( 7499 );

PL/SQL procedure successfully completed.

sql> select e.empno, e.ename, e.job
   2   from scott.emp e
   3          inner join table(cast(pkg_test.getEmp as tbl_empno)) v
   4            on e.empno = v.empno;

     EMPNO ENAME      JOB
 ---------- ---------- ---------
 
       7369  SMITH      CLERK
       7499  ALLEN      SALESMAN


Так и работаешь: перед запросом очищаешь список параметров, набиваешь его нужными и вперед.
...
Рейтинг: 0 / 0
11.10.2002, 05:48
    #32057301
Виктор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с числовыми параметрами
Да, много версий :-)
Но вопрос то стоял фактически так:
Возможно ли, используя только SQL, без создания процедур и функций , реализовать сабж.
С помощью процедур и функций плюс динамический sql это у меня давно решено, в общем-то. Но неужели нельзя это решить каким-нить простым способом?
А насчет Macro (&store) - я знаю, что это такое, и как это использовать. Но! Это ODAC, и в хелпе к нему вот что написано:
ODAC replaces all macro names with their values and sends SQL statement to Oracle when SQL execution is requested.
Ну а frQuery в FR не понимает, что это такое (вот мысль появилась, мобыть сделать frQuery = class(TOraQuery) и т.п...).
Но опять же - Но неужели нельзя это решить каким-нить простым способом?
...
Рейтинг: 0 / 0
11.10.2002, 09:21
    #32057322
Mich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с числовыми параметрами
Возможно ли, используя только SQL, без создания процедур и функций, реализовать сабж.
Возможно.
Но неужели нельзя это решить каким-нить простым способом?
А вот простым нет. Можно извратится. Если числа в массиве a[], на клиенте пишем

Код: plaintext
1.
2.
3.
tmp:='';
for i=Low(a) to High(a) do
      tmp:=tmp+'~'+inttostr(a[i])+'~';
q.ParamByName('store').AsString:=tmp;

А в запросе соответственно
Код: plaintext
1.
2.
SELECT *
  FROM stores
  WHERE '~'||to_char(a)||'~' LIKE :store

Но кому это надо...
...
Рейтинг: 0 / 0
11.10.2002, 11:46
    #32057412
Mich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с числовыми параметрами
Упс! Ошибочка вышла. На пост выше внимания не обращать. А лучше удалить.
Утро, переклинило...
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Проблема с числовыми параметрами / 12 сообщений из 12, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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