Plsql select语句中的Apex 5和PL/SQL错误

Plsql select语句中的Apex 5和PL/SQL错误,plsql,oracle-apex-5,Plsql,Oracle Apex 5,我有一个PL/SQL代码,它从一个表中进行选择,并在找到精确匹配时插入到临时表中,但在一个单独的视图中应该显示所有匹配项(如果找到)。假设我有一个名为SKU001的零件号,并在字段中键入它,它应该在一个字段中显示,然后插入到另一个表中。当我只键入SKU时,它不应插入到其他表中,而应仅显示所有匹配项,如SKU001、SKU002、SKU003等。代码可以排序,但我不断得到错误,这没有意义,因为我正在处理错误 让我试着把它分解一下。 假设我有一个名为TABLENAME的表,其中包含以下内容: NAM

我有一个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
temp表只有NAME、STOCKCODE和PRICE列

为了获得数据,我有两个表格,运行以下命令

select * from TABLENAME where regexp_like(NAME, :P4_SEARCH, 'i') or regexp_like(BARCODE, :P4_SEARCH, 'i') or regexp_like(STOCKCODE, :P4_SEARCH, 'i');
对于诱人的用户来说,Apex页面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时,它将显示搜索项并将其添加到可诱惑项中,但当我搜索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
我觉得很奇怪,因为我正在为
未找到的数据以及
太多的行添加
异常

我做错了什么?我希望我在这里提供了足够的信息,以便它有意义

最后一个音符!条形码是搜索的一部分,不会被插入,只是以防万一有人询问。搜索基于名称、条形码或股票代码,但名称、价格和股票代码将基于搜索显示。
P4_USER是我单独构建的会话用户,它只执行选择以仅显示用户的插入,而不显示其他用户数据。

Try
INSERT..select

insert into TEMPTABLE (STOCKCODE, NAME, PRICE)
select STOCKCODE, NAME, PRICE
from TABLENAME
where (NAME=:P4_SEARCH) or (BARCODE=:P4_SEARCH) or (STOCKCODE=:P4_SEARCH);

尝试插入。选择

insert into TEMPTABLE (STOCKCODE, NAME, PRICE)
select STOCKCODE, NAME, PRICE
from TABLENAME
where (NAME=:P4_SEARCH) or (BARCODE=:P4_SEARCH) or (STOCKCODE=:P4_SEARCH);
“找不到数据”可能是由Oracle self造成的。 它找不到合适的消息给你看

但是您是否已将“未找到数据”异常放入异常处理程序中

declare
  ...
begin
  ...
exception
  when no_data_found
  then
    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');

  when others
  then
     ...
end;
“找不到数据”可能是由Oracle self造成的。 它找不到合适的消息给你看

但是您是否已将“未找到数据”异常放入异常处理程序中

declare
  ...
begin
  ...
exception
  when no_data_found
  then
    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');

  when others
  then
     ...
end;

在我看来,你有两个例外

搜索
SKU
时,执行查询时捕获异常
未找到数据

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)
然后,当未找到数据时,从
部分执行新查询:

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');
但此查询会引发new异常
行太多
。是的,此查询可以使用
regexp\u like(STOCKCODE,'SKU','i')
条件重新运行多行。但是,当您在
子句中使用
时,您必须确信查询只返回一条记录。为了避免出现“行数过多”的异常,您可以尝试在“异常”部分更改查询,正如@sagi所建议的:

when no_data_found then
    insert into TEMPTABLE (STOCKCODE, NAME, PRICE)
    select STOCKCODE, 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');

在我看来,你有两个例外

搜索
SKU
时,执行查询时捕获异常
未找到数据

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)
然后,当未找到数据时,从
部分执行新查询:

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');
但此查询会引发new异常
行太多
。是的,此查询可以使用
regexp\u like(STOCKCODE,'SKU','i')
条件重新运行多行。但是,当您在
子句中使用
时,您必须确信查询只返回一条记录。为了避免出现“行数过多”的异常,您可以尝试在“异常”部分更改查询,正如@sagi所建议的:

when no_data_found then
    insert into TEMPTABLE (STOCKCODE, NAME, PRICE)
    select STOCKCODE, 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');

第一次查询不会引发
行数过多
异常,除非您有重复的
条形码
库存代码
名称

只需为
no_data_found
引发exeption,因为第一个查询需要精确匹配,将引发no data found,然后运行第二个查询

DECLARE
L_STOCK VARCHAR2(200);
L_BARCODE 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 (:P4_SEARCH=NAME) or (:P4_SEARCH=BARCODE) or (:P4_SEARCH=STOCKCODE);
insert 
into TEMPTABLE (STOCKCODE, NAME, PRICE)
values (l_stock, l_name, l_price);
exception
when no_data_found 
then
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');
end;

然后,在第一次查询中,这将为您提供一个SKU001的匹配,并将其插入到TESTERABLE中,或者如果部分匹配仅显示上次查询的结果。

第一次查询不会引发过多行的
异常,除非您有重复的
条形码
股票代码
名称

只需为
no_data_found
引发exeption,因为第一个查询需要精确匹配,将引发no data found,然后运行第二个查询

DECLARE
L_STOCK VARCHAR2(200);
L_BARCODE 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 (:P4_SEARCH=NAME) or (:P4_SEARCH=BARCODE) or (:P4_SEARCH=STOCKCODE);
insert 
into TEMPTABLE (STOCKCODE, NAME, PRICE)
values (l_stock, l_name, l_price);
exception
when no_data_found 
then
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');
end;

然后,在第一次查询中,这将为您提供一个SKU001匹配项,并将其插入到TESTERABLE中,或者如果部分匹配项仅显示上一次查询的结果。

Hi,感谢您的回复。这对一些插入仍然有效,但仍然给出完全相同的错误,并且似乎对我在问题中提到的第23行不满意。因此,如果我单独运行您的查询,它的工作原理与我的一样,但不是在完整的PL/SQL脚本中。您好,感谢您的响应。这对一些插入仍然有效,但仍然给出完全相同的错误,并且似乎对我在问题中提到的第23行不满意。因此,如果我单独运行您的查询,它的工作原理与我的一样,但不是在完整的PL/SQL脚本中。我错了吗?使用异常处理程序,您几乎可以做任何您想做的事情。例如,执行查询、启动另一个过程、显示消息。我已经编辑了我的答案。我的代码中有这两个例外
未找到任何数据
太多行
如果执行下一个查询,结果有多少行?从TABLENAME中选择股票代码、名称、价格,其中(名称=:P4_搜索)或(条形码=:P4_搜索)或(股票代码=:P4_搜索);你知道:p4_search的价值吗?我的想法是,我可以执行正则表达式查询,也可以使用c语言的一部分