SL无代

时间:2018-12-25 05:05:06

标签: oracle plsql oracleforms

enter image description here 有一个主表名称为项目主表

以另一种形式,如果我选择project-1 sl,则无需从项目主数据生成(21819001)。成功保存1条记录后,如果我选择相同的project-1 sl无需为下一个21819003生成类似21819002的代码,等等。

如果选择“ projects-3 sl”,则再次保存3条记录后应生成41819001,依此类推。

我正在使用Oracle Forms 10g。

1 个答案:

答案 0 :(得分:0)

这是您可能会做的一个示例-创建另一个表,其中包含每个项目的最新SL_NO。该数字是通过自动交易功能创建的,该功能可确保在多用户环境中不会重复。

PROJECTS_MASTER表和一些示例数据:

SQL> create table projects_master
  2    (project number primary key);

Table created.

SQL> insert into projects_master
  2    select 21819001 from dual union all
  3    select 41819001 from dual;

2 rows created.

此表将包含每个项目的最新SL_NO

SQL> create table projects_sl_no
  2    (project number constraint fk_prsl references projects_master (project),
  3     sl_no   number);

Table created.

函数本身;如果PAR_PROJECT的行存在,它将对其进行更新。否则,它将在PROJECTS_SL_NO表中创建一个全新的行。

SQL> create or replace function f_proj_sl_no
  2    (par_project in projects_master.project%type)
  3     return projects_sl_no.sl_no%type
  4  is
  5    pragma autonomous_transaction;
  6    l_sl_no projects_sl_no.sl_no%type;
  7  begin
  8    select b.sl_no + 1
  9      into l_sl_no
 10      from projects_sl_no b
 11      where b.project = par_project
 12      for update of b.sl_no;
 13
 14    update projects_sl_no b
 15      set b.sl_no = l_sl_no
 16      where b.project = par_project;
 17
 18    commit;
 19    return (l_sl_no);
 20  exception
 21    when no_data_found
 22    then
 23      lock table projects_sl_no in exclusive mode;
 24
 25      insert into projects_sl_no (project, sl_no)
 26        values (par_project, par_project);
 27
 28      commit;
 29      return (par_project);
 30  end f_proj_sl_no;
 31  /

Function created.

测试:

SQL> select f_proj_sl_no(21819001) sl_no from dual;

     SL_NO
----------
  21819001

SQL> select f_proj_sl_no(21819001) sl_no from dual;

     SL_NO
----------
  21819002

SQL> select f_proj_sl_no(21819001) sl_no from dual;

     SL_NO
----------
  21819003

SQL> select f_proj_sl_no(41819001) sl_no from dual;

     SL_NO
----------
  41819001

SQL> select * from projects_sl_no;

   PROJECT      SL_NO
---------- ----------
  21819001   21819003
  41819001   41819001

SQL>

在使用表单时,您可以在F_PROJ_SL_NO触发器WHEN-VALIDATE-RECORD中调用PRE-INSERT函数,甚至可以在插入数据库触发器之前创建 数据库触发器。重新插入到比我为测试目的而创建的表更复杂的表中。无论如何,那应该是故事的简单部分。