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

问题描述 投票:1回答:2

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

我有两张桌子: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_id,即view_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);
postgresql plpgsql postgresql-9.3
2个回答
1
投票

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


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;
© www.soinside.com 2019 - 2024. All rights reserved.