我想获取视图引用的表并显示它们。
我有两张桌子: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);
尝试SELECT lower(view_name) INTO v_name from view_details where view_id = v_id;
,因为它应该是双引号是First_View ...我的意思是如果你在创建视图时不使用“First_View”,字典会将First_View更改为更低(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;