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

时间:2015-03-18 13:24:23

标签: postgresql plpgsql postgresql-9.3

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

我有两张表:test1test2

我创建了一个引用这些表的视图

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

我创建了一个包含view idview name等详细信息的表格,如下所示:

CREATE TABLE View_Details
(
view_id int,
view_name varchar
);

并在其中插入一条记录。

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

现在我正在创建一个函数,其中一个参数v_idview_id,并希望获取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);

2 个答案:

答案 0 :(得分:1)

尝试SELECT lower(view_name) INTO v_name from view_details where view_id = v_id; 因为它应该用双引号作为First_View ...我的意思是如果你不使用" First_View"那么字典将把First_View改为降低(First_View)。创建视图时......

答案 1 :(得分:0)

实际问题是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;