如何插入 table 中不存在的 POPUP LoV 值?
How to insert with POPUP LoV value that doesnt exist in table?
我只想在标签 table 中插入 table 中不存在的值。
对于该字段,我使用 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 可以有多个值,我需要分别检查这些值,如果该值不在 table.
中则插入它们
在我看来,这是一种错误的做法。函数不应该 插入 任何东西 - 为此目的使用 过程 。
此外,您发布的整个代码可以由单个 MERGE
语句代替。方法如下。
样本table;最初,它包含 BMW
:
SQL> create table tags (name varchar2(20));
Table created.
SQL> insert into tags (name) values ('BMW');
1 row created.
当我使用 SQL*Plus 进行演示时,我使用了一个替代变量来模拟您的多 select 值弹出列表项。假设它包含三个名称,其中之一是 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.
table现在包含什么?
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);
我只想在标签 table 中插入 table 中不存在的值。 对于该字段,我使用 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 可以有多个值,我需要分别检查这些值,如果该值不在 table.
中则插入它们在我看来,这是一种错误的做法。函数不应该 插入 任何东西 - 为此目的使用 过程 。
此外,您发布的整个代码可以由单个 MERGE
语句代替。方法如下。
样本table;最初,它包含 BMW
:
SQL> create table tags (name varchar2(20));
Table created.
SQL> insert into tags (name) values ('BMW');
1 row created.
当我使用 SQL*Plus 进行演示时,我使用了一个替代变量来模拟您的多 select 值弹出列表项。假设它包含三个名称,其中之一是 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.
table现在包含什么?
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);