Oracle PlSQL:如何实现指向内存中记录类型的指针

Oracle PlSQL:如何实现指向内存中记录类型的指针,第1张

概述我有两个包pkg_company和pkg_employee. pkg_company包含(记录)类型定义typ_company. pkg_employee包含类型定义typ_employee. 我有一个公司类型的实例和1000个typ_employee实例.在员工类型中,我希望有一个指向公司实例的指针. declare c pkg_company.typ_company; e pk 我有两个包pkg_company和pkg_employee. pkg_company包含(记录)类型定义typ_company. pkg_employee包含类型定义typ_employee.

我有一个公司类型的实例和1000个typ_employee实例.在员工类型中,我希望有一个指向公司实例的指针.

declare    c pkg_company.typ_company;    e pkg_employee.typ_employee;begin  c := pkg_company.get(12345);  for e in (select employeeID from employee where companyID=12345)  loop    e := pkg_employee.get(12345,c);   -- c passed by reference in out nocopy    pkg_employee.process(e);  -- I would like to access company info insIDe here as e.c.companyname  end loop;  end;

如何在e中存储指向c的指针?我不想创建1000的c副本.只是想存储指针并在需要时访问该值.

感谢您的帮助!

结束;

解决方法 在Oracle sql中,use REF and DEREF functions可以将逻辑指针传递给存储在数据库表中的对象.
但是PL / sql中没有指针或引用这样的东西,所以你需要一个解决方法.

下面介绍PL / sql中可能的解决方法.我提前为代码中的任何错误道歉.它的目的是展示方法,而不是用于生产.

方法1 – 缓存访问方法

通用的想法是通过缓存结果的函数访问实体:

create or replace package EntitytAccess as  procedure GetCompany1(    pCompanyID in         number,pCompany   out nocopy pkg_company.typ_company   );   function GetCompany2(    pCompanyID in number  ) return pkg_company.typ_company;  procedure ClearCompanyCache;end;

访问包体:

create or replace package body EntitytAccess as  type typ_company_cache is table of pkg_company.typ_company index by number;  var_company_cache typ_company_cache;  procedure GetCompany1(    pCompanyID in         number,pCompany   out nocopy pkg_company.typ_company   )  is             begin    if( var_company_cache.exists(pCompanyID) )       pCompany := var_company_cache(pCompanyID);    else      pCompany := pkg_company.get(pCompanyID);      var_company_cache(pCompanyID) := pCompany;    end if;   end;  function GetCompany2(    pCompanyID in number  ) return pkg_company.typ_company  is         begin    if(not var_company_cache.exists(pCompanyID) )       var_company_cache(pCompanyID) := pkg_company.get(pCompanyID);    end if;                                   return  var_company_cache(pCompanyID);  end;  procedure ClearCompanyCache  is  begin                  var_company_cache.Delete;  end;end;

用法:

declare  c pkg_company.typ_company;  e pkg_employee.typ_employee;begin  EntityAccess.GetCompany2(12345,c);  for e in (select employeeID from employee where companyID=12345)  loop    e := pkg_employee.get(12345,c); -- c passed by reference in out nocopy                                     -- and c.companyID stored insIDe e.    pkg_employee.process(e);  -- No need to pass company,but insIDe process()                               -- method you need to call either                               -- EntityAccess.GetCompany1(e.companyID,var_c)                              -- or                              -- var_c := EntityAccess.GetCompany2(e.companyID)  end loop;  end;

方法2 – 环境包

由于包状态属于一个会话,因此您可以使用包变量来保存当前处理状态并在需要时引用它.

create or replace package ProcessEnvironment as  var_current_company pkg_company.typ_company;  -- may be more "global" variables hereend;/create or replace package body ProcessEnvironment asend;

用法:

declare  e pkg_employee.typ_employee;begin  ProcessEnvironmant.var_current_company := pkg_company.get(12345);  for e in (select employeeID from employee where companyID=12345)  loop    e := pkg_employee.get(12345,ProcessEnvironmant.var_current_company);                             -- c passed by reference in out nocopy                            -- and c.companyID stored insIDe e.    pkg_employee.process(e);  -- No need to pass company,but insIDe process()                               -- method you references                              -- ProcessEnvironmant.var_current_company                               -- with appropriate checks  end loop;  end;

混合的方法

似乎在方法1实例中从集合中复制了实例,尤其是在使用函数GetCompany2()访问时.复制构造函数可能足够快但产生一些开销.
对于方法2,在业务逻辑功能的代码中必须存在一些检查,因此从另一个角度来看它是维护开销.
要处理这两个问题,您可以使用缓存,但在包中只保留一个值:

create or replace package EntitytAccess as  procedure GetCompany(    pCompanyID in         number,pCompany   out nocopy pkg_company.typ_company   ); end;

包装体:

create or replace package body EntitytAccess as  var_cached_company pkg_company.typ_company;  procedure GetCompany(    pCompanyID in         number,pCompany   out nocopy pkg_company.typ_company   )  is             begin    if( (var_cached_company is null)         or         (var_cached_company.comanyID != pCompanyID)      )then      var_company_cache := pkg_company.get(pCompanyID);    end if;     pCompany := var_cached_company;  end;end;

用法:

declare  c pkg_company.typ_company;  e pkg_employee.typ_employee;begin  EntityAccess.GetCompany(12345,c);  for e in (select employeeID from employee where companyID= c.companyID)  loop    e := pkg_employee.get(c.companyID,c); -- c passed by reference in out nocopy                                            -- and c.companyID stored insIDe e.    pkg_employee.process(e);  -- No need to pass company,but insIDe process()                               -- method you need to call                               -- EntityAccess.GetCompany(e.companyID,var_c)                              -- where var_c is company object variable.  end loop;  end;
总结

以上是内存溢出为你收集整理的Oracle Pl / SQL:如何实现指向内存中记录类型的指针全部内容,希望文章能够帮你解决Oracle Pl / SQL:如何实现指向内存中记录类型的指针所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1160833.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存