PostgreSQL 9.3:使用函数获取视图中存在的 table 个名称的列表

PostgreSQL 9.3: Get list of table names present in view using function

我想获取视图中显示的 table 个名称的列表。

所以我用一个参数 (view_name) 创建了函数来获取 table 个名字。

函数funtion_GetTables_FromView

CREATE OR REPLACE FUNCTION funtion_GetTables_FromView
(
    view_Name varchar
)

RETURNS TABLE
(
    TableNames varchar
) AS

$BODY$

DECLARE 
    v_SQL varchar;

 BEGIN

    v_SQL := 'SELECT Table_Name  
             FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE
             WHERE View_Name = ''' ||  view_Name || '''';

    RAISE INFO '%',v_SQL;

    RETURN QUERY EXECUTE v_SQL;
END;

$BODY$

LANGUAGE PLPGSQL;   

调用函数:

select * from funtion_GetTables_FromView('myview');

但是出现错误:

ERROR:  structure of query does not match function result type

您只显示了部分错误信息,完整错误信息给出了实际原因:

ERROR: structure of query does not match function result type
Detail: Returned type information_schema.sql_identifier does not match expected type character varying in column 1.
Where: PL/pgSQL function funtion_gettables_fromview(character varying) line 14 at RETURN QUERY

因此 information_schema.table_name 列不是 varchar 列。立即解决这个问题是将列转换为所需的类型:

v_SQL := 'SELECT Table_Name::varchar
         FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE
         WHERE View_Name = ''' ||  view_Name || '''';

但是整个函数不必要地复杂并且容易出错。一个简单的 SQL 函数就可以了:

CREATE OR REPLACE FUNCTION funtion_GetTables_FromView(v_viewname varchar)
  RETURNS TABLE(tablenames varchar) 
AS
$$
  SELECT table_name  
  FROM information_schema.view_table_usage
  WHERE view_Name = v_viewname;
$$
LANGUAGE sql;

出于某种原因,这不需要转换为 varchar。我怀疑这与 PL/pgSQL 中的 运行 动态 SQL 有关。


不相关,但是:我个人认为在函数前加上 function_ 是非常无用的。使用它时很明显,它是一个函数。在您的编程语言中,您是否在所有 类 前加上 class_ 并在所有方法前加上 method_