Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 список значений в качестве параметра процедуры, как?  [new]
Sergant82
Member

Откуда:
Сообщений: 490
есть процедура

procedure tempmag(f_id in varchar2) is
vr_per number;
v_cur int;
curResult int;
i int;
v_Str varchar2(15000);
begin
delete from temp;
commit;
v_cur:=dbms_sql.open_cursor;
v_Str:='insert into temp
select magazin_name from spr_magazin where magazin_id in ('''||f_id||'''')';
dbms_sql.parse(v_cur,v_Str,dbms_sql.v7);
curResult:= dbms_sql.execute(v_cur);
v_str:='';
commit;
end;

процедура вызывается из delphi. если в качестве параметра передавать только например 9 то все работает, а если передать уже 9,8,7 то выдается ошибка invalid number.
В чем причина и куда копать? Спасибо)
3 ноя 15, 10:30    [18362708]     Ответить | Цитировать Сообщить модератору
 Re: список значений в качестве параметра процедуры, как?  [new]
AlexFF__|
Member

Откуда:
Сообщений: 2855
Sergant82,

Кавычки! (С)
3 ноя 15, 10:37    [18362760]     Ответить | Цитировать Сообщить модератору
 Re: список значений в качестве параметра процедуры, как?  [new]
Sergant82
Member

Откуда:
Сообщений: 490
AlexFF__|,

но ведь когда передается просто один magazin_id он же тоже в ковычках или нет?
3 ноя 15, 10:39    [18362776]     Ответить | Цитировать Сообщить модератору
 Re: список значений в качестве параметра процедуры, как?  [new]
-=APS=-
Member

Откуда: Киев
Сообщений: 737
Кривой баланс кавычек.
ЗЫ. Курсор закрывать надо.
3 ноя 15, 10:42    [18362801]     Ответить | Цитировать Сообщить модератору
 Re: список значений в качестве параметра процедуры, как?  [new]
AlexFF__|
Member

Откуда:
Сообщений: 2855
Sergant82
AlexFF__|,

но ведь когда передается просто один magazin_id он же тоже в ковычках или нет?

Попробуй догадаться, что с ним происходит.
3 ноя 15, 10:44    [18362827]     Ответить | Цитировать Сообщить модератору
 Re: список значений в качестве параметра процедуры, как?  [new]
ten
Member

Откуда: Екатеринбург
Сообщений: 1672
Sergant82
но ведь когда передается просто один magazin_id он же тоже в ковычках или нет?

Добавь dbms_output и сразу увидишь проблему.
3 ноя 15, 10:45    [18362840]     Ответить | Цитировать Сообщить модератору
 Re: список значений в качестве параметра процедуры, как?  [new]
ten
Member

Откуда: Екатеринбург
Сообщений: 1672
-=APS=-
ЗЫ. Курсор закрывать надо.

Здесь еще много интересного в коде :)
3 ноя 15, 10:46    [18362848]     Ответить | Цитировать Сообщить модератору
 Re: список значений в качестве параметра процедуры, как?  [new]
Sergant82
Member

Откуда:
Сообщений: 490
ten,
добавил в код dbms_output.put_line(f_id);
при тесте ничего не выводит, вообще ничего. что не так сделал?
3 ноя 15, 10:52    [18362892]     Ответить | Цитировать Сообщить модератору
 Re: список значений в качестве параметра процедуры, как?  [new]
ArtNick
Member

Откуда:
Сообщений: 1227
Sergant82,
insert into temp
select magazin_name from spr_magazin where magazin_id in ('9');
insert into temp
select magazin_name from spr_magazin where magazin_id in ('9,8,7');

Чувствуешь разницу?
3 ноя 15, 11:17    [18363028]     Ответить | Цитировать Сообщить модератору
 Re: список значений в качестве параметра процедуры, как?  [new]
tru55
Member

Откуда: СПб
Сообщений: 19790
Sergant82
при тесте ничего не выводит, вообще ничего. что не так сделал?

В чем работаешь? Небось в SQL Developer? :)
3 ноя 15, 11:17    [18363031]     Ответить | Цитировать Сообщить модератору
 Re: список значений в качестве параметра процедуры, как?  [new]
ArtNick
Member

Откуда:
Сообщений: 1227
-=APS=-
Кривой баланс кавычек.

Не угадал
3 ноя 15, 11:18    [18363037]     Ответить | Цитировать Сообщить модератору
 Re: список значений в качестве параметра процедуры, как?  [new]
ten
Member

Откуда: Екатеринбург
Сообщений: 1672
Sergant82
при тесте ничего не выводит, вообще ничего. что не так сделал?

+
procedure tempmag(f_id in varchar2) is
vr_per number;
v_cur int;
curResult int; 
i int;
v_Str varchar2(15000);
begin
  delete from temp;
  commit;
  v_cur:=dbms_sql.open_cursor; 
  v_Str:='insert into temp
             select magazin_name from spr_magazin where magazin_id in ('''||f_id||''')';
dbms_output.put_line(v_Str); 
dbms_sql.parse(v_cur,v_Str,dbms_sql.v7);
curResult:= dbms_sql.execute(v_cur); 
v_str:='';
commit;                       
end;

и не забудь включить serveroutput перед выполнением.
3 ноя 15, 11:19    [18363045]     Ответить | Цитировать Сообщить модератору
 Re: список значений в качестве параметра процедуры, как?  [new]
Sergant82
Member

Откуда:
Сообщений: 490
tru55,

в нем
3 ноя 15, 11:22    [18363068]     Ответить | Цитировать Сообщить модератору
 Re: список значений в качестве параметра процедуры, как?  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5930
[quot Sergant82]есть процедура

procedure tempmag(f_id in varchar2) is
vr_per number;
v_cur int;
curResult int; 
i int;
v_Str varchar2(15000);
begin
  delete from temp;
  commit;
  v_cur:=dbms_sql.open_cursor; 
  v_Str:='insert into temp
             select magazin_name from spr_magazin where magazin_id in ('''||f_id||'''')';
dbms_sql.parse(v_cur,v_Str,dbms_sql.v7);
curResult:= dbms_sql.execute(v_cur); 
v_str:='';
commit;                       
end;
3 ноя 15, 11:29    [18363119]     Ответить | Цитировать Сообщить модератору
 Re: список значений в качестве параметра процедуры, как?  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5930
тут зачем то лишних кавычек наляпал:

select magazin_name from spr_magazin where magazin_id in ('''||f_id||'''')';


вместо списка magazin_id in (1,2,3); получается строка magazin_id in ('1,2,3'); которая не может быть преобразована в число.
3 ноя 15, 11:32    [18363145]     Ответить | Цитировать Сообщить модератору
 Re: список значений в качестве параметра процедуры, как?  [new]
Sergant82
Member

Откуда:
Сообщений: 490
mcureenab,

да одну лишнюю тут написал ковычку (в процедуре все нормально) не заметил. но все равно не работает.
3 ноя 15, 11:33    [18363156]     Ответить | Цитировать Сообщить модератору
 Re: список значений в качестве параметра процедуры, как?  [new]
Sergant82
Member

Откуда:
Сообщений: 490
ArtNick,

1.разницу вижу. но как тогда поступить в данном случае. удалить ковычки в начале и в конце в строке, передаваемой в качестве параметра?


2. но почему тогда запрос отрабатывает в первом случае корректно ведь magazin_in тип number
получается select magazin_name from spr_magazin where magazin_id in ('9')
и
select magazin_name from spr_magazin where magazin_id in (9);
одно и тоже.
3 ноя 15, 11:33    [18363162]     Ответить | Цитировать Сообщить модератору
 Re: список значений в качестве параметра процедуры, как?  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5930
Sergant82
mcureenab,

да одну лишнюю тут написал ковычку (в процедуре все нормально) не заметил. но все равно не работает.


больше первой строки прочитать не выходит? ты еще две лишних кавычки написал, даже четыре.
3 ноя 15, 11:37    [18363195]     Ответить | Цитировать Сообщить модератору
 Re: список значений в качестве параметра процедуры, как?  [new]
Sergant82
Member

Откуда:
Сообщений: 490
mcureenab,

procedure tempmag(f_id in varchar2) is
vr_per number;
v_cur int;
curResult int;
i int;
v_Str varchar2(15000);
begin
delete from temp;
commit;
v_cur:=dbms_sql.open_cursor;
v_Str:='insert into temp
select magazin_name from spr_magazin where magazin_id in ('||f_id||')';
dbms_sql.parse(v_cur,v_Str,dbms_sql.v7);
curResult:= dbms_sql.execute(v_cur);
v_str:='';
commit;
end;
?
3 ноя 15, 11:41    [18363231]     Ответить | Цитировать Сообщить модератору
 Re: список значений в качестве параметра процедуры, как?  [new]
ArtNick
Member

Откуда:
Сообщений: 1227
Sergant82
ArtNick,

1.разницу вижу. но как тогда поступить в данном случае. удалить ковычки в начале и в конце в строке, передаваемой в качестве параметра?


2. но почему тогда запрос отрабатывает в первом случае корректно ведь magazin_in тип number
получается select magazin_name from spr_magazin where magazin_id in ('9')
и
select magazin_name from spr_magazin where magazin_id in (9);
одно и тоже.

1. Убрать кавычки
 v_Str:='insert into temp
             select magazin_name from spr_magazin where magazin_id in ('||f_id||')';

2. Потому что oracle, зная тип magazin_id,выполняет неявное преобразование. В первом случае успошно. А вот преобразовать строку '9,8,7' к числу невозможно, попробуй сам выполнить
Select to_number('9,8,7') from dual
3 ноя 15, 11:42    [18363234]     Ответить | Цитировать Сообщить модератору
 Re: список значений в качестве параметра процедуры, как?  [new]
Sergant82
Member

Откуда:
Сообщений: 490
Спс. Понял. Все работает.
3 ноя 15, 11:43    [18363245]     Ответить | Цитировать Сообщить модератору
 Re: список значений в качестве параметра процедуры, как?  [new]
ArtNick
Member

Откуда:
Сообщений: 1227
mcureenab
Sergant82
mcureenab,

да одну лишнюю тут написал ковычку (в процедуре все нормально) не заметил. но все равно не работает.


больше первой строки прочитать не выходит?

тут 18363119 даже первую строку сложно прочитать, форматирование нарушено.
3 ноя 15, 11:46    [18363273]     Ответить | Цитировать Сообщить модератору
 Re: список значений в качестве параметра процедуры, как?  [new]
Sergant82
Member

Откуда:
Сообщений: 490
ArtNick,

прочитал все строки но не сообразил. спасибо.
3 ноя 15, 11:49    [18363300]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить