【问题标题】:SL No generationSL 无代
【发布时间】:2018-12-25 05:05:05
【问题描述】:

有一个主表名作为项目主

如果我选择 project-1 sl 的另一种形式,则无需从项目主 (21819001) 生成。成功保存 1 条记录后,如果我选择相同的 project-1 sl不需要像21819002那样生成,下一个21819003,以此类推。

如果我选择项目,在 3 条记录保存后再次生成 - 3 sl 应该生成类似 41819001 等等。

我正在使用 Oracle Forms 10g。

【问题讨论】:

  • projects master 不是有效的表名。什么是“SL”?

标签: oracle plsql oracleforms


【解决方案1】:

这是您可能会做的一个示例 - 创建包含每个项目的最新 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>

当您使用 Forms 时,您可以在 WHEN-VALIDATE-RECORD 触发器、PRE-INSERT 中调用 F_PROJ_SL_NO 函数,或者如果您要插入更复杂的数据库触发器,甚至可以创建一个 before insert 数据库触发器表比我为测试目的创建的表。无论如何,这应该是故事中更简单的部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-20
    • 1970-01-01
    相关资源
    最近更新 更多