我只想在标签表中插入表中不存在的值。对于该字段,我使用POPUP LoV,它启用了:手动输入、多值、搜索为Youtube。我尝试了只在提交表单页面上执行的应用程序流程和功能,但无法正常工作。功能:
create or replace FUNCTION check_ins_tags (p_name VARCHAR2)
RETURN NUMBER
IS
count_res number := 0;
BEGIN
SELECT count(name)
INTO count_res
from tags
where upper(name) = upper(p_name);
IF count_res < 1 THEN
insert into tags (name)
select regexp_substr(p_name, '[^:]+', 1, level)
from dual
connect by level <= regexp_count(p_name, ',') + 1;
ELSE
NULL;
END IF;
RETURN count_res;
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
POPUP可以有多个值,我需要单独检查这些值,如果该值不在表中,它们就会插入。
在我看来,这是一种错误的方法。函数不应该是插入任何东西-为此目的,请使用过程。
此外,您发布的整个代码可以由单个MERGE
语句替代。方法如下。
样品表;最初,它包含BMW
:
SQL> create table tags (name varchar2(20));
Table created.
SQL> insert into tags (name) values ('BMW');
1 row created.
当我在这个演示中使用SQL*Plus时,我使用了一个替代变量来模拟您的多选值弹出列表项。假设它包含三个名称,其中一个是BMW
,所以不应该再插入它——这就是MERGE
的WHEN
子句所做的:
SQL> merge into tags t
2 using (select regexp_substr('&&P1_POPUP', '[^:]+', 1, level) name
3 from dual
4 connect by level <= regexp_count('&&P1_POPUP', ':') + 1
5 ) x
6 on (x.name = t.name)
7 when not matched then insert (name) values (x.name);
Enter value for p1_popup: Ford:BMW:Mercedes
2 rows merged.
这张表现在包含什么?
SQL> select * from tags;
NAME
--------------------
BMW
Mercedes
Ford
SQL>
我觉得还可以。
当您使用Apex时,您的merge
将是
merge into tags t
using (select regexp_substr(:P1_POPUP, '[^:]+', 1, level) name
from dual
connect by level <= regexp_count(:P1_POPUP, ':') + 1
) x
on (x.name = t.name)
when not matched then insert (name) values (x.name);