PostgreSQL 9.3:使用函数

时间:2015-12-28 10:36:01

标签: postgresql postgresql-9.3

我想获得视图中显示的表名列表。

所以我创建了一个带有一个参数(view_name)的函数来获取表名。

功能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

1 个答案:

答案 0 :(得分:2)

您只显示了部分错误消息,完整错误消息提供了实际原因:

  

错误:查询结构与功能结果类型不匹配
   详细信息:返回的类型information_schema.sql_identifier与第1列中不同的预期类型字符不匹配。
   其中:PL / pgSQL函数funtion_gettables_fromview(字符变化)第14行在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_的所有方法为所有课程添加前缀?