Невозможно сохранить разделенную запятыми числовую строку в varchar2 () - PullRequest
0 голосов
/ 01 апреля 2019

У меня есть список элементов, которые я хочу добавить одним кликом, для этого я создал таблицу со столбцом с типом varchar2 (4000), в этом столбце я хочу перечислить идентификаторы, которые относятся к другой таблицы, чтобы я мог вставить значение этого столбца в качестве параметра. ех. выберите t. * из table_name t, где t.point_id в (varchar2 строка разделенных запятыми point_ids).

Проблема, с которой я столкнулся, заключается в том, что, когда я помещаю более 1 идентификатора в поле varchar2, я получаю ORA-06502: PL / SQL: ошибка числа или значения: ошибка преобразования символа в число

Как мне избежать этой ошибки? Мое поле - varchar2, а не число, и я не хочу, чтобы оно конвертировалось. Мне нужно значение, которое я анализирую, чтобы сохранить. ех. (11, 12)

Изображение моей таблицы: enter image description here

РЕДАКТИРОВАТЬ: Примечание. Мой выбор работает нормально, у меня проблема с сохранением информации.

Моя вставка:

procedure lab_water_pointsgroup (v_group_id lab_water_pointsgroups.group_name%type,
                          v_group_name lab_water_pointsgroups.group_code%type,
                          v_group_code lab_water_pointsgroups.lab_points_ids%type,
                          v_lab_points_ids lab_water_pointsgroups.group_id%type) as
begin
update lab_water_pointsgroups
   set group_name = v_group_name,
       group_code = v_group_code,
       lab_points_ids = v_lab_points_ids
 where  group_id = v_group_id;
if ( SQL%RowCount = 0 ) then
insert into lab_water_pointsgroups
  (group_id, group_name, group_code, lab_points_ids)
values
  (v_group_id, v_group_name, v_group_code, v_lab_points_ids);
end if;
end;

Ответы [ 3 ]

2 голосов
/ 01 апреля 2019

Не уверен, как именно я могу вам здесь помочь, поскольку вы не привели никакого примера.Взгляните на демонстрацию ниже, возможно, решение с xmltable решит вашу проблему.HTH KR

create table testtab (id number);
insert into  testtab values (1);

select * from testtab where id in ('1');   -- works
select * from testtab where id in (1);     -- works
select * from testtab where id in (1,2);   -- works
select * from testtab where id in ('1,2'); -- ORA-01722: invalid number
select * from testtab where id in (select to_number(xt.column_value) from xmltable('1,2') xt); -- works
1 голос
/ 01 апреля 2019

Вот как вы определили параметры для вашей процедуры:

v_group_id        lab_water_pointsgroups.group_name%type,
v_group_name      lab_water_pointsgroups.group_code%type,
v_group_code      lab_water_pointsgroups.lab_points_ids%type,
v_lab_points_ids  lab_water_pointsgroups.group_id%type

Я подозреваю, что вы допустили ошибку с типами, потому что id имеет тип name, name имеет тип code и т. Д. Так должно быть:

v_group_id        lab_water_pointsgroups.group_id%type,
v_group_name      lab_water_pointsgroups.group_name%type, 
v_group_code      lab_water_pointsgroups.group_code%type,
v_lab_points_ids  lab_water_pointsgroups.lab_points_ids%type

И я предлагаю использовать merge вместо этого update / insert, но это не то, что вы просили:)

0 голосов
/ 01 апреля 2019

Ваша ошибка в том, что вы не различаете переменную, содержащую числа, разделенные запятыми, и фактическое перечисление в операторе 'in'.После анализа вашего кода и подготовки к выполнению ваше утверждение будет похоже на .. id in ('1,2,3') вместо ..id in (1,2,3), заметили ли вы разницу?Таким образом, вам нужно преобразовать значения через запятую в массив или, в этом случае, в коллекцию.Ваш код должен быть таким:

select t.*
  from table_name t
 where t.point_id in
       (select regexp_substr(YOUR_VARCHAR2_COLUMN_VALUE, '[^,]+', 1, level)
          from dual
        connect by regexp_substr(YOUR_VARCHAR2_COLUMN_VALUE, '[^,]+', 1, level) is not null)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...