Как передать строковый тип данных в числовой тип данных в plsql - PullRequest
0 голосов
/ 30 июня 2019

У меня есть такая процедура ...

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 Ответ

1 голос
/ 30 июня 2019

Если вы получили 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 error.


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

...