【问题标题】:Title: How to use a function that take a record in a select statement标题:如何使用在 select 语句中获取记录的函数
【发布时间】:2020-01-03 14:44:51
【问题描述】:

此代码正在运行

declare
    tA table of rA; --where ra is a record
    tB table of rB; --where rb is a record
    A Ta;
    B Tb;  
begin
    A    :=gettA(); -- where gettA return type is tA
    B    :=gettBFromtA(A); -- where gettB return type is tB and take an input of type tA
end;

但现在我处于这种情况:

我没有 gettBFromtA 而是 getrBFromRa,其中 getrBFromRa 返回类型为 rB 并接受 rA 类型的输入。我想从 A 那里得到 B。

与开始的代码中执行相同操作的解决方案是创建一个中间函数 Inter,例如

function Inter (arg1 in ra.field1%type, ….. argn in ra.fieldn%type ) return rb
is
      a ra;
      b rb
begin
      ra.arg1 := arg1 ….. ra.argn := argn
      return getrBFromRa(a);
end;

并将倒数第二行替换为

select Inter(t.arg1, … t.argn) bulk collect into B from table(A) t.

有更简单的方法吗?

除此之外,记录的定义可能会发生变化。而且我想避免多次写我记录的字段名称。

我正在寻找一种在 select 语句中直接使用 getrBFromrA 的方法。

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    我已尝试模拟您的问题。首先,我在 DB 中创建了以下对象:

    CREATE table stack59565292(
           ID number(6),
           NAME varchar2(20)
    );
    
    insert into stack59565292 values (1, 'VOLKAN');
    insert into stack59565292 values (2, 'PIERRE');
    commit;
    /
    
    
    CREATE OR REPLACE TYPE stack59565292_typeA AS OBJECT
    (        ID number(6),
           NAME varchar2(20)
    );
    
    CREATE OR REPLACE TYPE stack59565292_typeB AS OBJECT
    ( NAME varchar2(20)
    );
    
    CREATE OR REPLACE TYPE stack59565292_type_TABa AS TABLE OF stack59565292_typeA;
    
    CREATE OR REPLACE TYPE stack59565292_type_TABb AS TABLE OF stack59565292_typeB;
    

    然后,下面的过程如你所愿。类型构造函数完成这项工作。你应该在模式中定义集合类型:http://www.dba-oracle.com/t_pls_00642_local_collection_types_not_allowed_in_sql_statement.htm

    declare
    
      A stack59565292_type_TABa;
      B stack59565292_type_TABb;
    
    begin
      -- Test statements here
      select stack59565292_typeA(x.ID, x.NAME)
        BULK COLLECT
        INTO A
        from stack59565292 x;
    
      FOR v_iterate IN A.FIRST .. A.LAST LOOP
        dbms_output.put_line('ID: ' || A(v_iterate).ID || ' - NAME: ' || A(v_iterate).NAME);
      END LOOP;
    
      select stack59565292_typeB(x.NAME) BULK COLLECT INTO B from table(A) x;
    
    
      FOR v_iterate IN B.FIRST .. B.LAST LOOP
        dbms_output.put_line('NAME: ' || B(v_iterate).NAME);
      END LOOP;
    
    end;
    
    

    【讨论】:

      猜你喜欢
      • 2013-05-09
      • 2011-12-06
      • 1970-01-01
      • 2022-06-29
      • 1970-01-01
      • 2018-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多