我想获得视图中显示的表名列表。
所以我创建了一个带有一个参数(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
答案 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_
的所有方法为所有课程添加前缀?