将任意rowtype作为参数传递

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将任意rowtype作为参数传递相关的知识,希望对你有一定的参考价值。

假设我有一个这样的FOR循环:

FOR recs IN (SELECT table1.col, table2.col FROM TabA table1, TabB table2) 
LOOP
    renderRec(recs);
END LOOP;

我需要制作一个这样的程序:

PROCEDURE renderRec(inRec IN ????) AS ...

我如何为renderRec()定义“recs”参数,因为它不像简单的表%rowtype等?

答案

到目前为止,我可以理解您的要求,您希望将查询(SELECT table1.col, table2.col FROM TabA table1, TabB table2)中的所有记录传递给您的renderRec程序,并且您遇到的问题是在For Loop中运行查询的结果集时,您不知道应该将哪个dataype传递给程序,流程。当然其他人建议使用refcursor,这可能是一种做法。但我会通过另一种方式创建一个对象,然后将对象传递给procedure。您将看到我在BULK中使用FOR LOOP操作,这是最快速和最简单的方法。请参阅下文,并在内容中阅读我的评论以便理解:

- 表设置

create table tabA(col number);
/
insert into taba values(1);
insert into taba values(2);
insert into taba values(3);
/
create table tabB(col number);
/
insert into tabb values(11);
insert into tabb values(22);
insert into tabb values(33);

commit;

- 使用与查询结果集相同的列创建的对象,用于保存结果

CREATE OR REPLACE Type rec is OBJECT
(
 col1 number,
 col2 number
);

- 处理一个Object表来保存多个结果集

Create or replace Type var_rec is table of rec ;
/

-Procedure在1中获取查询的结果集并显示它。

CREATE OR REPLACE PROCEDURE renderRec(inpt IN var_rec)
AS
BEGIN
  FOR rec IN 1..inpt.count
  LOOP
    --displaying the resultset got from the select query
    dbms_output.put_line(inpt(rec).col1 ||'--'||inpt(rec).col2 );
  END LOOP;
END;
/

- 匿名块将查询的值传递给过程

DECLARE
  v_recs var_rec:=var_rec();
BEGIN
  SELECT rec(table1.col,
             table2.col) 
  bulk collect  INTO v_recs
  FROM TabA table1,
    TabB table2 ;

  --Passing the resultset of the above query to the procedure.
  renderRec(v_recs);
END;

以上是关于将任意rowtype作为参数传递的主要内容,如果未能解决你的问题,请参考以下文章

将接口从片段传递到kotlin中的活动

在C代码中将结构体变量作为参数传递效率忒低

使用 std::thread 函数 C++11 将指针作为参数传递

Oracle PL/SQL 传递行类型作为构造函数参数

如何传递和使用任意lambda函数作为参数[重复]

如何将数据从一个活动传递到android中的另一个活动片段? [复制]