У меня есть этот код PL/SQL, который делает выбор из таблицы и вставляет во временную таблицу, когда найдено точное совпадение, но в отдельном представлении должны отображаться все совпадения, если они найдены. Итак, скажем, у меня есть номер детали, называемый SKU001, и я набираю его в поле, он должен отображать в одном поле и вставлять в другую таблицу. Когда я только набираю SKU, он не должен вставляться в другую таблицу, а только отображать все совпадения, такие как SKU001, SKU002, SKU003 и т. Д. Код работает, но я продолжаю получать ошибки, которые не имеют смысла, поскольку я обслуживаю ошибки .
Итак, позвольте мне попытаться немного разбить его. скажем, у меня есть таблица с именем TABLENAME со следующим:
NAME | STOCKCODE | PRICE | other columns ...
Item1 | SKU001 | 12.99
Item2 | SKU002 | 13.99
Item3 | SKU003 | 14.99
Во временной таблице есть только столбцы NAME, STOCKCODE и PRICE.
Чтобы получить данные, у меня есть 2 табличные формы, которые выполняют следующее.
select * from TABLENAME where regexp_like(NAME, :P4_SEARCH, 'i') or regexp_like(BARCODE, :P4_SEARCH, 'i') or regexp_like(STOCKCODE, :P4_SEARCH, 'i');
а для TEMPTABLE есть Apex page SQL.
select STOCKCODE, NAME, PRICE TEMPTABLE where SESSION_USER=:P4_USER
DECLARE
l_stock VARCHAR2(200);
l_name VARCHAR2(200);
l_price VARCHAR2(200);
BEGIN
select STOCKCODE, NAME, PRICE
into l_stock, l_name, l_price
from TABLENAME where (NAME=:P4_SEARCH) or (BARCODE=:P4_SEARCH) or (STOCKCODE=:P4_SEARCH);
insert into TEMPTABLE (STOCKCODE, NAME, PRICE)
values (l_stock, l_name, l_price);
exception
when too_many_rows then
select STOCKCODE, NAME, PRICE
into l_stock, l_name, l_price
from TABLENAME where regexp_like(NAME, :P4_SEARCH, 'i') or regexp_like(BARCODE, :P4_SEARCH, 'i') or regexp_like(STOCKCODE, :P4_SEARCH, 'i');
when no_data_found then
select STOCKCODE, NAME, PRICE
into l_stock, l_name, l_price
from TABLENAME where regexp_like(NAME, :P4_SEARCH, 'i') or regexp_like(BARCODE, :P4_SEARCH, 'i') or regexp_like(STOCKCODE, :P4_SEARCH, 'i');
END;
Когда я только это:
BEGIN
select STOCKCODE, NAME, PRICE
into l_stock, l_name, l_price
from TABLENAME where regexp_like(NAME, :P4_SEARCH, 'i') or regexp_like(BARCODE, :P4_SEARCH, 'i') or regexp_like(STOCKCODE, :P4_SEARCH, 'i');
END;
это работает отлично каждый раз.
Если я выполню только это:
BEGIN
select STOCKCODE, NAME, PRICE
into l_stock, l_name, l_price
from TABLENAME where (NAME=:P4_SEARCH) or (BARCODE=:P4_SEARCH) or (STOCKCODE=:P4_SEARCH);
insert into TEMPTABLE (STOCKCODE, NAME, PRICE)
END;
но при запуске всего сценария PL/SQL, как указано выше, я получаю ошибки как таковые: когда я ищу SKU001, он отображает элемент поиска и добавляет его в TEMPTABLE, но когда я ищу SKU, он выдает мне ошибку:
ORA-01422: exact fetch returns more than requested number of rows
ORA-06512: at line 23
ORA-01403: no data found
ПРИМЕЧАНИЕ!! Отображаемая здесь строка 23 не является строкой 23 в приведенном выше коде из-за форматирования моего браузера, строка 23 выглядит следующим образом:
22 -> when no_data_found then
23 -> select STOCKCODE, NAME, PRICE into stock, name, price from TABLENAME where regexp_like(NAME, :P4_SEARCH, 'i') or regexp_like(BARCODE, :P4_SEARCH, 'i') or regexp_like(STOCKCODE, :P4_SEARCH, 'i');
В то же время, если я очищаю или сбрасываю сеанс, он отображает:
ORA-01403: no data found
ORA-06512: at line 23
ORA-01403: no data found
Что мне кажется странным, потому что я добавляю exception
для no_data_found
, а также для too_many_lines
Что я здесь делаю неправильно? Я надеюсь, что я предоставил достаточно информации здесь для того, чтобы это имело смысл.
Последнее примечание! Штрих-код является частью поиска и не вставляется, если кто-то спросит об этом. Поиск основан на имени, штрих-коде или биржевом коде, но имя, цена и биржевой код отображаются на основе поиска. P4_USER - это пользователь сеанса, который я создал отдельно, который просто выбирает для отображения только вставки пользователя, а не другие пользовательские данные.