plsql - 如何在plsql中将对象类型属性的值分配给具有相同属性属性的不同对象类型?
问题描述
我有两种具有相同属性的不同类型。我需要将第一种类型的属性值分配给其他类型。除了模式和对象名称之外,它们完全相同。
CREATE OR REPLACE TYPE SCHEMA_A.type_A AS OBJECT(XCOL VARCHAR2(80), YCOL VARCHAR2(80), ZCOL CHAR(2));
CREATE OR REPLACE TYPE SCHEMA_B.type_B AS OBJECT(XCOL VARCHAR2(80), YCOL VARCHAR2(80), ZCOL CHAR(2));
我可以像下面一样手动分配值,但实际上有 80 多个属性。有没有更优雅的方式来达到同样的效果?
SCHEMA_A.type_A.XCOL := SCHEMA_B.type_B.XCOL;
SCHEMA_A.type_A.YCOL := SCHEMA_B.type_B.YCOL;
...
解决方案
正如他在@Belayer的回答中提到的,最好的解决方案是为这两种方案创建一个通用的数据类型。
快速而肮脏的解决方案是使用 SQL 查询进行转换。查看以下可重现的示例:
create or replace type A.objA as object (attr1 varchar2 (8), attr2 int, attr3 date)
/
create or replace type B.objB as object (attr1 varchar2 (8), attr2 int, attr3 date);
/
create or replace type A.objtA as table of A.objA;
/
create or replace type A.objtB as table of B.objB;
/
var rc refcursor
declare
a A.objA;
b B.objB := B.objB ('name B', 1, trunc (sysdate));
function cast (o B.objB) return A.objA is
t A.objtA;
begin
select cast (multiset (select * from A.objtB (b))
as A.objtA) into t from dual;
return t(1);
end;
begin
a := cast (b);
open :rc for select a a from dual;
end;
/
A(ATTR1, ATTR2, ATTR3)
------------------------------------------------
OBJA('name B', 1, '2020-10-18 00:00:00')
推荐阅读
- android - 如何获取或缓存主颤振引擎?
- xml - 基于“名称”属性使用 XSLT 重命名 XML 节点
- tensorflow - TensorsFlow/Keras 如何为 seq2seq 问题找到不可预测的训练示例?
- javascript - Javascript - 循环嵌套对象
- java - 预期的意外异常
但是是 - swift - iOS Metal Unknown 类型名称 'simd_half3'; 你的意思是“simd_char3”吗?
- python-3.x - 访问 netcdf 文件中嵌套组中的变量(文件格式 HDF5)
- spring-kafka - 如何在不从 kafka 生产者配置 bean 设置的情况下将应用程序属性设置为默认的 kafka 生产者模板
- javascript - 无法使用 Angular 和 peer js 安装 ng-boostrap
- html - 我的文档的位置是我的边距的负数(边距 100,位置 -100)