问题描述
嗨,汤姆,
我有一种情况,我必须创建一个函数,它将返回一个唯一的数字 (后缀R和7个数字),这将比数据库中存在的数据与主键的特定列进行比较。如果函数生成的数字是唯一的,并且在数据库中不存在,则一个单独的过程将其插入数据库,否则它将通过一个错误,而不是函数需要生成一个新值。
我试过使用
'R' | | TRUNC(DBMS_RANDOM.VALUE (低 => 1,高 => 10))| | ROUND(DBMS_RANDOM.VALUE (低 => 100,高 => 9999))
但不能管理所有条件。
创建或替换函数FN_GET_NEW_IRD_NO (VARCHAR2中的pSeriesNo) 返回VARCHAR2
作为
里尔诺·瓦尔查尔2(50);
lDTH_Irdno VARCHAR2(14);
lIPTV_Irdno VARCHAR2(14);
返回VARCHAR2(200);
lSmartNoDTH VARCHAR2(15);
lSmartNoIPTV VARCHAR2(15);
lDecVal编号;
开始
如果长度 (pSeriesNo)> 5,则
返回 “ird系列编号应小于或等于5”;
如果结束;
lIrdNo := 'R' | | pSeriesNo | | TRUNC(DBMS_RANDOM.VALUE (低 => 1,高 => 10))| | ROUND(DBMS_RANDOM.VALUE (低 => 100,高 => 9999));
选择最大 (ird_no) 进入lDTH_Irdno
来自sapadmin。eqt_movement_app
其中ird_no LIKE 'R' | | lIrdNo;
选择最大 (ird_no) 进入lIPTV_Irdno
来自sapadmin。eqt_movement_app
其中ird_no = lIrdNo;
DBMS_OUTPUT.PUT_LINE (“确定”);
如果lDTH_Irdno不为NULL,则
在lSmartNoDTH中选择唯一的SMART_CARD_NO
来自sapadmin。eqt_movement_app
其中ird_no = lDTH_Irdno和ROWNUM = 1;
其他
DBMS_OUTPUT.PUT_LINE ('ird_no为空 ');
如果结束;
如果lIPTV_Irdno不为NULL,则
在lSmartNoIPTV中选择唯一的SMART_CARD_NO
来自sapadmin。eqt_movement_app
其中ird_no = lIPTV_Irdno和ROWNUM = 1;
如果结束;
从对偶选择HEX2DEC(lIPTV_Irdno) 进入lDecVal;
从对偶选择DEC2HEX(lDecVal 1) 到lIPTV_Irdno;
lDTH_Irdno := SUBSTR(lDTH_Irdno,2,长度 (lDTH_Irdno)) 1;
lSmartNoDTH := SUBSTR(lSmartNoDTH,2,LENGTH(lSmartNoDTH)) 1;
lSmartNoIPTV := SUBSTR(lSmartNoIPTV,2,长度 (lSmartNoIPTV)) 1;
返回值: = 'DTH IRD编号:' | | lDTH_Irdno | | ',IPTV IRD编号:' | | lIPTV_Irdno | | 'DTH Smart No : '
| | lSmartNoDTH | | ',IPTV Smart No :' | | lSmartNoIPTV;
返回lReturnVal;
结束FN_GET_NEW_IRD_NO;
我有一种情况,我必须创建一个函数,它将返回一个唯一的数字 (后缀R和7个数字),这将比数据库中存在的数据与主键的特定列进行比较。如果函数生成的数字是唯一的,并且在数据库中不存在,则一个单独的过程将其插入数据库,否则它将通过一个错误,而不是函数需要生成一个新值。
我试过使用
'R' | | TRUNC(DBMS_RANDOM.VALUE (低 => 1,高 => 10))| | ROUND(DBMS_RANDOM.VALUE (低 => 100,高 => 9999))
但不能管理所有条件。
创建或替换函数FN_GET_NEW_IRD_NO (VARCHAR2中的pSeriesNo) 返回VARCHAR2
作为
里尔诺·瓦尔查尔2(50);
lDTH_Irdno VARCHAR2(14);
lIPTV_Irdno VARCHAR2(14);
返回VARCHAR2(200);
lSmartNoDTH VARCHAR2(15);
lSmartNoIPTV VARCHAR2(15);
lDecVal编号;
开始
如果长度 (pSeriesNo)> 5,则
返回 “ird系列编号应小于或等于5”;
如果结束;
lIrdNo := 'R' | | pSeriesNo | | TRUNC(DBMS_RANDOM.VALUE (低 => 1,高 => 10))| | ROUND(DBMS_RANDOM.VALUE (低 => 100,高 => 9999));
选择最大 (ird_no) 进入lDTH_Irdno
来自sapadmin。eqt_movement_app
其中ird_no LIKE 'R' | | lIrdNo;
选择最大 (ird_no) 进入lIPTV_Irdno
来自sapadmin。eqt_movement_app
其中ird_no = lIrdNo;
DBMS_OUTPUT.PUT_LINE (“确定”);
如果lDTH_Irdno不为NULL,则
在lSmartNoDTH中选择唯一的SMART_CARD_NO
来自sapadmin。eqt_movement_app
其中ird_no = lDTH_Irdno和ROWNUM = 1;
其他
DBMS_OUTPUT.PUT_LINE ('ird_no为空 ');
如果结束;
如果lIPTV_Irdno不为NULL,则
在lSmartNoIPTV中选择唯一的SMART_CARD_NO
来自sapadmin。eqt_movement_app
其中ird_no = lIPTV_Irdno和ROWNUM = 1;
如果结束;
从对偶选择HEX2DEC(lIPTV_Irdno) 进入lDecVal;
从对偶选择DEC2HEX(lDecVal 1) 到lIPTV_Irdno;
lDTH_Irdno := SUBSTR(lDTH_Irdno,2,长度 (lDTH_Irdno)) 1;
lSmartNoDTH := SUBSTR(lSmartNoDTH,2,LENGTH(lSmartNoDTH)) 1;
lSmartNoIPTV := SUBSTR(lSmartNoIPTV,2,长度 (lSmartNoIPTV)) 1;
返回值: = 'DTH IRD编号:' | | lDTH_Irdno | | ',IPTV IRD编号:' | | lIPTV_Irdno | | 'DTH Smart No : '
| | lSmartNoDTH | | ',IPTV Smart No :' | | lSmartNoIPTV;
返回lReturnVal;
结束FN_GET_NEW_IRD_NO;
专家解答
这是一个奇怪的要求,因为你会在1000万后没有数字-我鼓励你重新考虑这种方法。
无论如何,由于它只有1000万个数字,因此这是一种不同的策略-我们将按随机顺序对它们进行预生成,而您只需根据需要分别选择一个。
我已经在下面做了一百万,但你明白了
该会话将 * 拥有 * 该密钥,直到它提交或回滚。没有人能得到它。
无论如何,由于它只有1000万个数字,因此这是一种不同的策略-我们将按随机顺序对它们进行预生成,而您只需根据需要分别选择一个。
我已经在下面做了一百万,但你明白了
SQL> create global temporary table t1 2 on commit preserve rows as 3 select 'R'||to_char(rownum,'FM0000000') tag 4 from ( select 1 from dual connect by level <= 1000), 5 ( select 1 from dual connect by level <= 1000) 6 where rownum < 1000000 7 order by dbms_random.value; Table created. SQL> SQL> create table t ( 2 id int not null, 3 tag varchar2(10) not null, 4 constraint t_pk primary key ( id ) 5 ) 6 organization index; Table created. SQL> SQL> insert into t 2 select rownum, tag from t1; 999999 rows created. SQL> SQL> exec dbms_stats.gather_table_stats('','T') PL/SQL procedure successfully completed. SQL> SQL> select /*+ index(t) first_rows(10) */ id, tag 2 from t 3 where rownum <= 10 ; ID TAG ---------- ---------- 1 R0919471 2 R0594711 3 R0403352 4 R0535468 5 R0954674 6 R0585909 7 R0254793 8 R0868272 9 R0046145 10 R0077835 10 rows selected. SQL> SQL> variable my_key varchar2(10) SQL> declare 2 rc sys_refcursor; 3 pk int; 4 begin 5 loop 6 open rc for 7 select /*+ index(t) first_rows(10) */ id, tag 8 from t 9 where rownum <= 5 for update skip locked; 10 11 fetch rc into pk, :my_key; 12 if rc%found then 13 delete from t where id = pk; 14 close rc; 15 exit; 16 else 17 close rc; 18 end if; 19 end loop; 20 end; 21 / PL/SQL procedure successfully completed. SQL> print my_key MY_KEY -------------------------------- R0919471复制
该会话将 * 拥有 * 该密钥,直到它提交或回滚。没有人能得到它。
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
【纯干货】Oracle 19C RU 19.27 发布,如何快速升级和安装?
Lucifer三思而后行
786次阅读
2025-04-18 14:18:38
Oracle RAC 一键安装翻车?手把手教你如何排错!
Lucifer三思而后行
664次阅读
2025-04-15 17:24:06
Oracle数据库一键巡检并生成HTML结果,免费脚本速来下载!
陈举超
591次阅读
2025-04-20 10:07:02
【ORACLE】你以为的真的是你以为的么?--ORA-38104: Columns referenced in the ON Clause cannot be updated
DarkAthena
548次阅读
2025-04-22 00:13:51
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
532次阅读
2025-04-17 17:02:24
【ORACLE】记录一些ORACLE的merge into语句的BUG
DarkAthena
510次阅读
2025-04-22 00:20:37
一页概览:Oracle GoldenGate
甲骨文云技术
496次阅读
2025-04-30 12:17:56
火焰图--分析复杂SQL执行计划的利器
听见风的声音
470次阅读
2025-04-17 09:30:30
OR+DBLINK的关联SQL优化思路
布衣
382次阅读
2025-05-05 19:28:36
3月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
382次阅读
2025-04-15 14:48:05