Как передать строковый тип данных в числовой тип данных в 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 ошибка.


Наконец, что бы вы хотели сделать? Какую проблему ты пытаешься решить? Очевидно, кроме особых случаев (только одна строка для каждого значения) ваш запрос не может работать. Если бы вы могли предоставить контрольный пример (создать таблицу и вставить в пример данных), а также ожидаемый результат, вам было бы легче помочь.

Другие вопросы по тегам