使用函数获取视图视图引用的表

Get the tables referenced by a view view using a function

我想获取视图引用的 tables 并显示它们。

我有两个 table:test1test2

我创建了一个视图,它引用了这些 tables

CREATE VIEW First_View 
AS 
   SELECT * FROM test1 
UNION 
   SELECT * FROM test2;

我创建了一个 table,其中包含 view idview name 等视图详细信息,如下所示:

CREATE TABLE View_Details
(
view_id int,
view_name varchar
);

并在其中插入了一条记录。

INSERT INTO view_details values(1,'First_View');

现在我正在创建一个带有一个参数 v_id 的函数,即 view_id 并希望获取所有 table,它们被 view_namt 引用。

我正在执行此操作,但我在消息中没有收到任何消息:

CREATE OR REPLACE FUNCTION For_testing(v_id INT)
RETURNS VOID AS
$$
Declare
    var varchar;
    v_name varchar;
BEGIN
    SELECT view_name INTO v_name from view_details where view_id = v_id;

    FOR var IN SELECT Table_NAME from INFORMATION_SCHEMA.VIEW_TABLE_USAGE
                        WHERE View_Name = v_name LOOP
    RAISE INFO '%',VAR;

    END LOOP;
END;
$$
language plpgsql;

调用函数:

SELECT for_testing(1);

尝试SELECT lower(view_name) INTO v_name from view_details where view_id = v_id; 因为它应该用双引号引起来 First_View... 我的意思是如果您在创建视图时不使用 "First_View",字典会将 First_View 更改为 lower(First_View)。 ..

实际问题是view name区分大小写。如您所见,view_name 已插入为 First_View,其中 F 和 V 是大写字母。所以我知道了解决方案:

首先我们需要使用lower()函数将大写字母转换为小写字母。

CREATE OR REPLACE FUNCTION For_testing(v_id INT)
RETURNS VOID AS
$$
Declare
   var varchar;
   v_name varchar;
BEGIN
   SELECT view_name INTO v_name from view_details where view_id = v_id;

   /* Solved here*/
  v_name := lower(v_name);

   FOR var IN SELECT Table_NAME from INFORMATION_SCHEMA.VIEW_TABLE_USAGE
                    WHERE View_Name = v_name LOOP
   RAISE INFO '%',VAR;

END LOOP;
END;
$$
language plpgsql;