sql - oracle sql:“获取或插入”存储过程
问题描述
我想做一个接收输入参数的存储过程,然后
- 如果目标表不包含该值,则创建一个新行,然后返回创建行的 id
- 如果目标表已经包含输入参数,则返回该行的 id
目前我只在输入参数是新的时才设法插入新行:
--exemple of table with a primary id a column with value
create table unique_number_table (
id NUMBER(12) not null,
UNIQUE_NUMBER VARCHAR2(80) not null,
constraint PK_ID primary key (ID)
);
create sequence SEQ_NUMBER
INCREMENT BY 1
START WITH 2
MAXVALUE 999999999
MINVALUE 0;
create or replace procedure insert_or_get_unique_number ( input_number in varchar ) is
begin
insert into unique_number_table (id, UNIQUE_NUMBER)
select SEQ_NUMBER.NEXTVAL ,input_number
from dual
where not exists(select * from unique_number_table
where UNIQUE_NUMBER =input_number);
end insert_or_get_unique_number;
你知道怎么做吗?
解决方案
在我看来,你想要一个存储函数而不是一个过程。
create or replace function insert_or_get_unique_number (input_number varchar2)
return UNIQUE_NUMBER_TABLE.ID%type
is
L_NUM UNIQUE_NUMBER_TABLE.ID%type;
begin
select ID
into L_NUM
from UNIQUE_NUMBER_TABLE
where UNIQUE_NUMBER = input_number;
return L_NUM;
exception
when NO_DATA_FOUND then
insert into unique_number_table (id, UNIQUE_NUMBER)
values (SEQ_NUMBER.NEXTVAL, input_number)
returning ID into L_NUM;
return L_NUM;
end insert_or_get_unique_number;
推荐阅读
- python - 从 Python 列表反向访问元素的时间成本?
- java - 如何将带有 json 数据的 json 文件导出到 csv 文件中
- java - 有没有更好的方法来用 Java 编写游戏流程?
- phpunit - URI 的 PHPUnit 测试失败,而请求在浏览器中成功
- kubernetes - Azure AGIC 插件
- javascript - 如何编写一个阻止按钮直到复选框被激活的函数?
- flutter - 使用 Provider 将 Map 的状态保存到 Flutter 应用
- jenkins - 在 jenkins 管道中运行 sonarqube 时出错
- java - 无法将 @NamedEntityGraph 与 @ElementCollecion 一起使用
- xcode - iOS 14 中的 SwiftUI 列表 - 删除箭头和分隔线