oracle 管道函数 执行计划,达梦7的管道表函数(PIPELINED TABLE FUNCTION)

前一阵,我们在为客户移植ORACLE应用到达梦7时, 碰到了PL/SQL的PIPELINED TABLE FUNCTION,经过努力现在达梦7也支持了这个特性。简单介绍一下其用法:

先创建一个嵌套表类型s100_t:

SQL>create or replace type s100_t is table of varchar(100);

2   /

操作已执行

已用时间: 119.854(ms) clock tick:245457446. Execute id is 7.

然后创建一个普通的函数, 它返回一个嵌套表对象,其内容通过普通的元素赋值获得:

SQL>create or replace function s100f1 return s100_t is

2     a    s100_t;

3   begin

4       a = s100_t('hello', 'world', 'xxxx');

5       a.extend(2);

6

7       a(4) = 'yyyy';

8       a(5) = 'uuuu';

9       return a;

10  end;

11  /

操作已执行

已用时间: 270.073(ms) clock tick:553103141. Execute id is 8.

S100f2函数是一个管道表函数, 使用了pipe row语句。这个函数不需要显式创建一个对象, 也不需要返回值:

SQL>create or replace function s100f2 return s100_t

2   pipelined

3   is

4   begin

5       pipe row('hello');

6       pipe row('world');

7   end;

8   /

操作已执行

已用时间: 134.468(ms) clock tick:275385227. Execute id is 9.

下面使用一个匿名脚本打印s100f1的结果:

SQL>declare

2      b s100_t;

3   begin

4       b = s100f1;

5       for i in 1..b.count loop

6          print b(i);

7       end loop;

8   end;

9   /

hello

world

xxxx

yyyy

uuuu

PL/SQL 过程已成功完成

已用时间: 101.508(ms) clock tick:207884297. Execute id is 10.

对于管道表函数, 也可以同样输出:

SQL>declare

2      b s100_t;

3   begin

4       b = s100f2;

5       for i in 1..b.count loop

6          print b(i);

7       end loop;

8   end;

9   /

hello

world

PL/SQL 过程已成功完成

已用时间: 212.282(ms) clock tick:434746279. Execute id is 11.

当然也可以这样, 直接用select 语句输出:

SQL>select * from table(s100f2);

行号       C

---------- -----

1          hello

2          world

已用时间: 115.449(ms) clock tick:236433874. Execute id is 12

转自:

http://blog.sina.com.cn/s/blog_6f86f39a0101d3qz.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是一个使用管道函数Oracle 存储过程示例代码: ``` CREATE OR REPLACE TYPE dept_type AS OBJECT ( deptno NUMBER, dname VARCHAR2(14), loc VARCHAR2(13) ); CREATE OR REPLACE TYPE dept_tab_type AS TABLE OF dept_type; CREATE OR REPLACE FUNCTION get_dept_info (p_deptno IN NUMBER) RETURN dept_tab_type PIPELINED AS l_dept dept_type; BEGIN FOR r IN (SELECT deptno, dname, loc FROM dept WHERE deptno = p_deptno) LOOP l_dept := dept_type(r.deptno, r.dname, r.loc); PIPE ROW(l_dept); END LOOP; RETURN; END; CREATE OR REPLACE PROCEDURE display_dept_info (p_deptno IN NUMBER) AS BEGIN FOR r IN (SELECT * FROM TABLE(get_dept_info(p_deptno))) LOOP DBMS_OUTPUT.PUT_LINE('Deptno: ' || r.deptno || ', Dname: ' || r.dname || ', Loc: ' || r.loc); END LOOP; END; ``` 这个存储过程定义了一个 `dept_type` 类型和一个 `dept_tab_type` 类型,然后定义了一个名为 `get_dept_info` 的函数,该函数接受一个部门编号参数,并返回一个 `dept_tab_type` 类型,其中包含指定部门的信息。函数使用 `PIPELINED` 关键字示它是一个管道函数,可以逐行返回结果。 最后,存储过程 `display_dept_info` 调用 `get_dept_info` 函数并打印返回的部门信息。 ### 回答2: Oracle 存储过程管道函数示例代码如下: ```sql -- 创建一个简单的存储过程管道函数,返回指定范围内的奇数 CREATE OR REPLACE FUNCTION get_odd_numbers( start_number IN NUMBER, end_number IN NUMBER) RETURN SYS_REFCURSOR PIPELINED AS v_number NUMBER := start_number; BEGIN WHILE v_number <= end_number LOOP IF MOD(v_number, 2) = 1 THEN PIPE ROW(v_number); -- 将当前奇数放入管道中 END IF; v_number := v_number + 1; END LOOP; RETURN; END; / ``` 此示例代码创建了一个名为get_odd_numbers的存储过程管道函数,接受两个参数start_number和end_number,用于指定返回的奇数范围。函数内部通过一个循环判断每个数是否为奇数,并将奇数依次放入管道中。最后通过RETURN语句返回结果。 使用该存储过程管道函数可以通过以下方式获取奇数: ```sql -- 调用存储过程管道函数 SELECT * FROM TABLE(get_odd_numbers(1, 10)); ``` 上述代码将返回1至10之间的所有奇数:1、3、5、7、9。 ### 回答3: Oracle存储过程管道函数是一种特殊类型的存储过程,它可以返回一个结果集。下面是一个示例代码,用于说明Oracle存储过程管道函数的用法: ```sql -- 创建一个管道对象作为存储过程的返回类型 CREATE OR REPLACE TYPE employee_info AS OBJECT ( employee_id NUMBER, full_name VARCHAR2(100), hire_date DATE ); / -- 创建一个管道类型,用于存储多个employee_info对象 CREATE OR REPLACE TYPE employee_table AS TABLE OF employee_info; / -- 创建一个具有管道函数功能的存储过程 CREATE OR REPLACE FUNCTION get_employees RETURN employee_table PIPELINED AS BEGIN -- 在这里可以编写查询语句,获取想要的员工数据 -- 这里仅做示例,假设从一个名为employees的中获取数据 FOR emp IN (SELECT employee_id, first_name || ' ' || last_name AS full_name, hire_date FROM employees) LOOP -- 将查询结果逐行插入管道中 PIPE ROW(employee_info(emp.employee_id, emp.full_name, emp.hire_date)); END LOOP; RETURN; END; / -- 调用存储过程管道函数,并输出结果 SELECT * FROM TABLE(get_employees()); ``` 上述代码中,首先我们创建了一个管道对象`employee_info`,它包含了三个属性:`employee_id`、`full_name`和`hire_date`。然后,我们创建了一个管道类型`employee_table`,用于存储多个`employee_info`对象。 接着,我们创建了一个具有管道函数功能的存储过程`get_employees`,其中使用了一个游标`emp`来存储查询结果。通过`PIPE ROW`语句,我们将每一行查询结果插入到管道中。最后,通过`RETURN`语句返回结果。 最后,在主程序中我们通过`SELECT`语句调用存储过程管道函数,并使用`TABLE`函数将结果显示出来。 这个示例代码演示了如何使用Oracle存储过程管道函数来获取员工信息,并将查询结果作为一个结果集返回。通过这种方式,我们可以更加灵活地处理和使用存储过程的输出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值