我想获取视图引用的表并显示它们。
我有两张表:test1
和test2
我创建了一个引用这些表的视图
CREATE VIEW First_View
AS
SELECT * FROM test1
UNION
SELECT * FROM test2;
我创建了一个包含view id
和view 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);
答案 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;