Как передать строковый тип данных в числовой тип данных в plsql
У меня такая процедура...
declare
v_psg varchar2(10);
id_no number;
begin
select value into v_psg from settings_am where key = 'PSG';
select id into id_no from product where to_char(psg) in (v_psg);
end;`
Значение, возвращаемое из select value into v_psg from settings_am where key = 'PSG';
было бы
'1','2','3'
когда я запускаю эту процедуру, я получаю сообщение об ошибке - ORA-01403.
Посоветуйте, пожалуйста, как мне передать значение v_psg в столбец psg таблицы продуктов?
РЕДАКТИРОВАТЬ - Попробовал с предложенным контрольным примером
1 ответ
Если вы получили ORA-01403
Тебе повезло. Это NO_DATA_FOUND
ошибка, которая означает, что один (вероятно, первый) запрос ничего не дал.
Эти два заявления могут быть объединены в
select id
from product
where to_char(psg) in (select value
from settings_am
where key = 'PSG'
);
Почему бы вы выбрали value
сначала, а потом использовать его в другом запросе? Кроме того, это просто не сработает. v_psg
объявлен как VARCHAR2
переменная. Как вы это описали, он содержит следующую строку: '1','2','3'
, как будто это то, что у вас есть:
SQL> create table settings_am (key varchar2(10),
2 value varchar2(20)); --> note size here
Table created.
SQL> insert into settings_am (key, value)
2 values ('PSG', q'['1','2','3']');
1 row created.
SQL> select * From settings_am;
KEY VALUE
---------- --------------------
PSG '1','2','3'
SQL>
Как видите, я увеличил value
размер столбца, хотя объявленная вами переменная говорит 10
, Почему? Потому что
SQL> select length(value) from settings_am where key = 'PSG';
LENGTH(VALUE)
-------------
11
то есть вы не можете положить что-то длинное 11 в то, что принимает длину 10.
Или, если ваши данные на самом деле содержат 3 строки для PSG
ключ, эти значения уже заключены в одинарные кавычки? Если так, это странно; люди обычно этого не делают. Во всяком случае, предположим, что вам удалось получить строку '1,2,3'
(что, как я полагаю, у вас есть на самом деле) в VARCHAR2
переменная, то вы должны разбить его на строки, чтобы иметь возможность использовать его в IN
пункт:
SQL> create table product (id number, psg varchar2(10));
Table created.
SQL> insert into product (id, psg) values (100, '1');
1 row created.
SQL> insert into product (id, psg) values (200, '2');
1 row created.
SQL>
Запрос тогда (где строки #3 - 5 представляют разбиение строки на строки):
SQL> select p.id
2 from product p
3 where p.psg in (select regexp_substr('&&v_psg', '[^,]+', 1, level)
4 from dual
5 connect by level <= regexp_count('&&v_psg', ',') + 1
6 );
Enter value for v_psg: 1,2,3
ID
----------
100
200
Так что, не было бы проще использовать
SQL> select id
2 from product
3 where to_char(psg) in (select value
4 from settings_am
5 where key = 'PSG'
6 );
ID
----------
100
200
SQL>
Обратите внимание, что оба параметра также показывают, почему ваш запрос неверен: вы не можете поместить два значения (строки) в переменную, объявленную как id_no number;
как вы получите TOO_MANY_ROWS
ошибка.
Наконец, что бы вы хотели сделать? Какую проблему ты пытаешься решить? Очевидно, кроме особых случаев (только одна строка для каждого значения) ваш запрос не может работать. Если бы вы могли предоставить контрольный пример (создать таблицу и вставить в пример данных), а также ожидаемый результат, вам было бы легче помочь.