Sql 如何插入表中不存在的弹出LoV值?

Sql 如何插入表中不存在的弹出LoV值?,sql,oracle,plsql,oracle-apex,Sql,Oracle,Plsql,Oracle Apex,我只想在tags表中插入表中不存在的值。 对于该字段,我使用弹出式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表中插入表中不存在的值。 对于该字段,我使用弹出式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;

弹出窗口可以有多个值,我需要分别检查这些值,如果该值不在表中,则插入它们。

在我看来,这是一种错误的方法。函数不应该插入任何东西——使用过程来实现这一目的

此外,您发布的整个代码可以由一个MERGE语句替换。这是怎么做的

样本表;最初,它包含宝马:

在本演示中使用SQL*Plus时,我使用了一个替代变量,该变量模拟您的多选值弹出列表项。假设它包含三个名称,其中一个是BMW,因此不应再次插入-这就是MERGE's 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.
我觉得还可以

当您使用Apex时,合并将是

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); 

在我看来,这是一个错误的方法。函数不应该插入任何东西——使用过程来实现这一目的

此外,您发布的整个代码可以由一个MERGE语句替换。这是怎么做的

样本表;最初,它包含宝马:

在本演示中使用SQL*Plus时,我使用了一个替代变量,该变量模拟您的多选值弹出列表项。假设它包含三个名称,其中一个是BMW,因此不应再次插入-这就是MERGE's 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.
我觉得还可以

当您使用Apex时,合并将是

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); 

我可以在“连接方式”中使用“,”而不是“:”作为分隔符吗?不,在本上下文中不可以,因为Apex通过冒号将值与多个选择项分隔开:。但是,一般来说,是的-您可以使用任何分隔符。我是否可以在“连接方式”中使用“,”而不是“:”?否,不在此上下文中,因为Apex通过冒号将值与多选项分隔开:。但是,一般来说,是的,你可以使用任何你想要的分隔符。