powered by simpleCommunicator - 2.0.44     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Проблема с числовыми параметрами
12 сообщений из 12, страница 1 из 1
Проблема с числовыми параметрами
    #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
Проблема с числовыми параметрами
    #32056928
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересно, мне понравилась задачка:) Насколько знаю, параметра-массива в Оракле нет, так что на ум приходит либо предварительное наполнение pl/sql-таблицы нужными параметрами и переделка запроса для работы с ней (но это м.б. неоптимально по скорости выполнения), либа шаманство с динамическим sql со всеми вытекающими.
...
Рейтинг: 0 / 0
Проблема с числовыми параметрами
    #32056933
MW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А воспользоваться Macro (&store) ?
...
Рейтинг: 0 / 0
Проблема с числовыми параметрами
    #32056940
Виктор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 MW:
Я использую FastReport, в нем и выполняется запрос. Macro (&store) не переваривается.
...
Рейтинг: 0 / 0
Проблема с числовыми параметрами
    #32056951
ora600
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да и парситься будет каждый раз...Хотя, если этот запрос будет выполняться достаточно редко, то почему бы и строкой не передавать ?
Соорудите функцию на клиенте, которая из кучки чисел делает одну строку с этими числами через запятую.Только

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

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

2Виктор:
Конструкция where id in (&store) прекрасно понимается Ораклом. Посмотри в описание запроса для FastReport там наврняка должно быть что-то про макросы.
Как например в ODAC можно для запроса использовать метод MacroByName( 'store' )... И згнать туда то что нужно.
...
Рейтинг: 0 / 0
Проблема с числовыми параметрами
    #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
Проблема с числовыми параметрами
    #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
Проблема с числовыми параметрами
    #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
Проблема с числовыми параметрами
    #32057412
Mich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Упс! Ошибочка вышла. На пост выше внимания не обращать. А лучше удалить.
Утро, переклинило...
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Проблема с числовыми параметрами
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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