暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

何为Oracle的表函数

原创 姚崇 2023-04-04
384

table函数说明

以下面Oracle常用的查看执行计划为例

select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));
复制

上述的SQL查询是一个Oracle数据库中的查询,用于显示执行计划。具体来说,它是从dbms_xplan.display_cursor函数中获取执行计划信息,并将其显示为表格形式。下面是这个查询的各个部分的解释:

  • select *: 选择所有列。
  • from: 从指定的表或视图中获取数据。
  • table(): 这是一个表函数,它将函数的结果作为一个表来处理。在这里,table函数用于将dbms_xplan.display_cursor的结果转换成一个可以用select * from查询的表格。

为什么不能通过call调用

dbms_xplan.display_cursor: 这是一个Oracle内置的函数,用于显示指定SQL语句的执行计划。函数接收三个参数,分别是:SQL_ID、子游标号和格式选项。在这个例子中,参数是null,null和’allstats last’,分别表示显示最后执行的SQL语句的执行计划,不指定子游标号,并显示所有统计信息。

这个查询与存储过程的call调用和begin end;执行有一些区别:

查询类型:这个查询是一个select查询,它返回一个结果集。而存储过程调用和begin end;块通常用于执行非查询操作(例如插入、更新或删除记录),尽管它们也可以返回结果集。

目的:这个查询的目的是获取并显示SQL执行计划,以便于分析性能问题。而存储过程和begin end;块通常用于封装复杂的业务逻辑或执行批量操作。

结构:select * from table()查询的结构与存储过程调用和begin end;块不同。存储过程调用使用call关键字,后跟存储过程的名称和参数列表。
begin end;块是一个PL/SQL匿名块,它包含一个或多个PL/SQL语句,以及异常处理和其他编程结构。

那dbms_xplan.display_cursor为什么不能用call调用

dbms_xplan.display_cursor不能用call调用的原因是它不是一个存储过程,而是一个表函数。在Oracle数据库中,有以下两种类型的函数:

存储过程:这些是编写在数据库中的程序,通常用于执行一系列操作,如插入、更新或删除记录。存储过程可以使用call语句调用,但它们通常不返回结果集。存储过程可能会有输出参数,但它们不是直接作为查询结果返回的。

函数(包括表函数):函数与存储过程类似,但它们有一个返回值。在Oracle中,表函数是一种特殊类型的函数,它返回一个表类型的结果集。这意味着你可以像查询普通表一样查询表函数的结果。dbms_xplan.display_cursor就是这样一个表函数。
select * from table(dbms_xplan.display_cursor(null,null,‘allstats last’));

因为dbms_xplan.display_cursor是一个表函数,所以你不能使用call调用它。相反,你需要使用table()函数将其结果转换为表格格式,并使用select * from查询结果。这是一个典型的表函数调用示例:

在这个例子中,table()函数将dbms_xplan.display_cursor的结果转换为表格形式,以便于使用select * from查询。这样,你就可以查看执行计划并分析SQL性能问题。

Oracle中如何定义一个表函数,如果判断一个函数是表函数还是存储过程函数

定义一个表类型:首先,你需要定义一个表类型,它将用作表函数的返回类型。通常,这是一个嵌套表类型或者一个对象的集合类型。例如:

CREATE TYPE example_obj AS OBJECT (
  id NUMBER,
  value VARCHAR2(100)
);
CREATE TYPE example_table_type AS TABLE OF example_obj;
复制

创建表函数:使用PL/SQL创建一个函数,该函数返回在步骤1中定义的表类型。在函数体内,填充表类型的实例,并在函数结束时返回它。例如:

CREATE OR REPLACE FUNCTION example_table_function
  RETURN example_table_type
AS
  v_result example_table_type := example_table_type();
BEGIN
  -- Populate the table type with data
  v_result.extend;
  v_result(1) := example_obj(1, 'Example value 1');
  
  v_result.extend;
  v_result(2) := example_obj(2, 'Example value 2');
  
  -- Return the table type
  RETURN v_result;
END;
/
复制

有关函数和存储过程之间的区别,以下是它们的主要特点:

存储过程:通常用于执行一系列操作,如插入、更新或删除记录。它们没有返回值,但可以有输入和输出参数。在PL/SQL中,存储过程使用PROCEDURE关键字定义。

函数(包括表函数):函数与存储过程类似,但它们有一个返回值。在PL/SQL中,使用FUNCTION关键字定义。表函数是一种特殊类型的函数,它返回一个表类型的结果集。这意味着你可以像查询普通表一样查询表函数的结果。

要判断一个函数是表函数还是存储过程函数,你可以查看其定义:

如果使用FUNCTION关键字定义,并返回一个表类型的结果集(例如:RETURN example_table_type),则该函数是一个表函数。
如果使用PROCEDURE关键字定义,那么它是一个存储过程。
同时,你可以通过查看函数的返回类型来判断它是不是一个表函数。如果返回类型是一个表类型,那么这个函数就是一个表函数。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论