Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在plsql中,如何将对象类型属性的值分配给具有相同属性的不同对象类型?_Plsql_Plsqldeveloper_Oracle19c_Object Type - Fatal编程技术网

在plsql中,如何将对象类型属性的值分配给具有相同属性的不同对象类型?

在plsql中,如何将对象类型属性的值分配给具有相同属性的不同对象类型?,plsql,plsqldeveloper,oracle19c,object-type,Plsql,Plsqldeveloper,Oracle19c,Object Type,我有两种具有相同属性的不同类型。我需要将第一个类型的属性值分配给另一个类型。除了模式和对象名之外,它们完全相同 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

我有两种具有相同属性的不同类型。我需要将第一个类型的属性值分配给另一个类型。除了模式和对象名之外,它们完全相同

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;
...

好吧,你几乎被一个属性一个属性的分配所困扰。这是创建两个相同类型的副产品-这是您的主要错误。但有两种可能的解决方案:

  • 创建一个只有1种类型的公共模式,然后更新引用 到公共模式
  • 编写一个函数,将这两种类型作为参数,源和 并逐属性复制属性。你的代码 然后调用函数

  • 好吧,你几乎被一个属性一个属性的分配所困扰。这是创建两个相同类型的副产品-这是您的主要错误。但有两种可能的解决方案:

  • 创建一个只有1种类型的公共模式,然后更新引用 到公共模式
  • 编写一个函数,将这两种类型作为参数,源和 并逐属性复制属性。你的代码 然后调用函数

  • 正如他在回答中提到的,最好的解决方案是为这两个方案创建一个公共数据类型


    快速而肮脏的解决方案是使用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')
    

    正如他在回答中提到的,最好的解决方案是为这两个方案创建一个公共数据类型


    快速而肮脏的解决方案是使用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')
    

    由于类型是模式对象,因此它们具有可以稍微简化赋值的默认构造函数:

    declare
        v_type_a type_a := type_a('a', 'a', 'a');
        v_type_b type_b := type_b('b', 'b', 'b');
    begin
        v_type_a := type_a(v_type_b.xcol, v_type_b.ycol, v_type_b.zcol);
    end;
    /
    
    在18c及以上版本中,由于新的限定表达式特性,同样的想法甚至适用于仅PL/SQL类型


    如果只有两种类型,那么上面的快捷方式可能是您的最佳选择。如果您需要分配多组类型,请告知我们;在这种情况下,可能值得花费额外的精力使用ANYDATA或使用数据字典动态构建函数来构建解决方案。

    由于类型是架构对象,它们具有默认构造函数,可以稍微简化赋值:

    declare
        v_type_a type_a := type_a('a', 'a', 'a');
        v_type_b type_b := type_b('b', 'b', 'b');
    begin
        v_type_a := type_a(v_type_b.xcol, v_type_b.ycol, v_type_b.zcol);
    end;
    /
    
    在18c及以上版本中,由于新的限定表达式特性,同样的想法甚至适用于仅PL/SQL类型

    如果只有两种类型,那么上面的快捷方式可能是您的最佳选择。如果您需要分配多组类型,请告知我们;在这种情况下,可能值得花费额外的精力使用ANYDATA或使用数据字典动态构建函数来构建解决方案