Oracle 11g:如何生成科目表中的数字

Oracle 11g:如何生成科目表中的数字,oracle,oracle11g,numbers,account,generate,Oracle,Oracle11g,Numbers,Account,Generate,在oracle 11g SQL或PL/SQL中,对于科目表,我希望生成如下数字:从级别2开始:级别1 a/c编号为1,2,3,4,5 如果它位于头1中,即资产,则它将生成第一个数字101 如果它位于头2中,则它将生成第一个数字201 第三级 如果父项选择为101,则它将生成第一个a/c编号为10101 如果父项选择为102,则它将生成第一个a/c编号为10201 等等 对于第4级: 如果父项选择10101,则它将生成第一个a/c编号10101001 如果父项选择10201,则它将生成第一个a/c

在oracle 11g SQL或PL/SQL中,对于科目表,我希望生成如下数字:从级别2开始:级别1 a/c编号为1,2,3,4,5

如果它位于头1中,即资产,则它将生成第一个数字101 如果它位于头2中,则它将生成第一个数字201

第三级

如果父项选择为101,则它将生成第一个a/c编号为10101 如果父项选择为102,则它将生成第一个a/c编号为10201

等等

对于第4级:

如果父项选择10101,则它将生成第一个a/c编号10101001 如果父项选择10201,则它将生成第一个a/c编号10201001

等等

所有其他总帐相同2=负债,3=费用,4=收入,5=资本


请提供帮助。

下面的查询使用您定义的帐户结构生成了近4000个帐户。您可以通过修改“按级别连接”来调整生成的帐户数非常感谢EJ Egyed对您的帮助,我在下面编写了一个函数,该函数对我很有用

create or replace function get_value_no( v_value_level in number,
                                         v_value_abbreviation in varchar2,
                                         v_value_parent in number)
 return number is
 --
 -- create trigger or function, in case of function pass following columns as parameters
 -- value_leve, value_abbreviation, value_parent_acct
 v_value_level number := 3;
 v_value_abbreviation char(1) := 'L'; -- (A)sset (L)iability (E)xpense (R)evenue (C)apital
 v_valno number;
 v_parent number := 203; -- parent account which user will select 
 v_char  varchar2(20);
begin

 -- ======================
 if v_value_level in (2, 3) then
   select max(nvl(value_no,0))
    into v_valno
    from value_set
   where value_level = v_value_level
    and value_abbreviation = v_value_abbreviation
    and value_type = 'NA'
    and value_parent_acct = v_value_parent;
   if v_valno is null or v_valno <= 0 then
    v_char := to_char(v_value_parent)||'01';
    v_valno := v_char;
   else
    v_valno := v_valno+1;
   end if;
 end if;
 -- ======================
 if v_value_level = 4 then
   select max(nvl(value_no,0))
    into v_valno
    from value_set
   where value_level = v_value_level
    and value_abbreviation = v_value_abbreviation
    and value_type = 'NA'
    and value_parent_acct = v_value_parent;
   if v_valno is null or v_valno <= 0 then
    v_char := to_char(v_value_parent)||'001';
    v_valno := v_char;
   else
    v_valno := v_valno+1;
   end if;
 end if;
 -- ======================
return v_valno;
-- 
end;

更新以尽可能清晰地说明。
   ACCOUNT_LEVEL    ACCOUNT_TYPE    ACCOUNT_NUMBER
________________ _______________ _________________
               1 Asset           1
               2 Liability       101
               3 Expense         10101
               4 Revenue         10101001
               5 Capital         10101001001
               5 Capital         10101001002
               5 Capital         10101001003
               5 Capital         10101001004
               5 Capital         10101001005
               4 Revenue         10101002
               5 Capital         10101002001
               5 Capital         10101002002
               5 Capital         10101002003
               5 Capital         10101002004
...

3,905 rows selected.
create or replace function get_value_no( v_value_level in number,
                                         v_value_abbreviation in varchar2,
                                         v_value_parent in number)
 return number is
 --
 -- create trigger or function, in case of function pass following columns as parameters
 -- value_leve, value_abbreviation, value_parent_acct
 v_value_level number := 3;
 v_value_abbreviation char(1) := 'L'; -- (A)sset (L)iability (E)xpense (R)evenue (C)apital
 v_valno number;
 v_parent number := 203; -- parent account which user will select 
 v_char  varchar2(20);
begin

 -- ======================
 if v_value_level in (2, 3) then
   select max(nvl(value_no,0))
    into v_valno
    from value_set
   where value_level = v_value_level
    and value_abbreviation = v_value_abbreviation
    and value_type = 'NA'
    and value_parent_acct = v_value_parent;
   if v_valno is null or v_valno <= 0 then
    v_char := to_char(v_value_parent)||'01';
    v_valno := v_char;
   else
    v_valno := v_valno+1;
   end if;
 end if;
 -- ======================
 if v_value_level = 4 then
   select max(nvl(value_no,0))
    into v_valno
    from value_set
   where value_level = v_value_level
    and value_abbreviation = v_value_abbreviation
    and value_type = 'NA'
    and value_parent_acct = v_value_parent;
   if v_valno is null or v_valno <= 0 then
    v_char := to_char(v_value_parent)||'001';
    v_valno := v_char;
   else
    v_valno := v_valno+1;
   end if;
 end if;
 -- ======================
return v_valno;
-- 
end;