唐山设计网站公司,学习前端的网站,做网站简单还是做app简单,手机浏览器connection-- 动态生成字母方式主键#xff0c;A-Z 大于Z自动进位【26进制数值表示】-- 参数#xff1a;动态查询表和主键列
create or replace function charkey (tabName char, pkName char) return char
asv_key varchar2(4); -- 表中查询出当前主键列最大值v_char varchar2(…-- 动态生成字母方式主键A-Z 大于Z自动进位【26进制数值表示】-- 参数动态查询表和主键列
create or replace function charkey (tabName char, pkName char) return char
asv_key varchar2(4); -- 表中查询出当前主键列最大值v_char varchar2(4) : ; -- 输出用变量v_len number(1); -- 查询出最大值字符串长度v_i number(1); -- 循环控制变量v_c char(1); -- 提取单个字符变量v_flag number(1) : 1; -- 是否进位变量v_count number; -- 查询表中记录总数
begin-- 查询表中记录数execute immediate select count(1) from || tabName into v_count;-- 如果表中没有记录则返回Aif (v_count 0) then v_char : A;return v_char;end if;-- 获取指定表中主键列当前最大值execute immediate select || pkName || from ||(select rownum r, t. || pkName || from ||(select || pkName || from || tabName || order by length( || pkName || ) desc, || pkName || desc) t) where r 2into v_key;-- 字符串长度v_len : length(v_key);-- 循环控制变量v_i : v_len;-- 从最后一个字符开始向前循环遍历while v_i 1 loopv_c : substr(v_key, v_i, 1);-- 如果需要进位当前字符1if(v_flag 1) thenv_c : chr(ascii(v_c)1);v_flag : 0;end if;-- 当前字符超出上限if( ascii(v_c) ascii(Z)) thenv_c : A;v_flag : 1;end if;v_char : v_c || v_char;v_i : v_i - 1;end loop;-- 如果遇到ZZ情况需要补充一位Aif(v_flag 1) thenv_char : A || v_char;end if; return v_char;
end;-- 测试表
create table testtab
(id varchar2(4) primary key,val number(4)
);-- 测试通过函数动态生成主键插入数据
declarev_count number(9) : 1;
beginwhile v_count 30 loopinsert into testtab values(charkey(testtab,id), 1); v_count : v_count 1;end loop;
end;select * from testtab;