添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
暂无图片
暂无图片
暂无图片
暂无图片

何为Oracle的表函数

姚崇 2023-04-04
66

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

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

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

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

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