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_
?
我想获取视图中显示的 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_
?