我需要关于如何使用SQL(或动态SQL)来编写循环的帮助,在该循环中我使用‘x’作为列名的占位符.有没有人有什么建议,让我不必为每一列手动运行这条语句?

CREATE OR REPLACE PROCEDURE PCI_COLUMNS()
AS $$
DECLARE
  x RECORD;
BEGIN
    FOR x IN (select col from L_USA.COLUMNS WHERE TYPE = 'PCI')
    LOOP
        ATTACH MASKING POLICY COMMERCIAL_PCI
        ON L_USA.DEMO(x)
        USING (x, CUST_ID)
        TO ROLE COMM_PCI
        PRIORITY 30;
    END LOOP;
END;
$$ LANGUAGE plpgsql;

上面的代码是我所设想的,但它显示了一个错误

错误:语法错误位于或接近"$1"WHERE:PL/PgSQL函数"pci_Columns"中第5行附近的SQL语句[错误ID:1-6571f613-3df6ae50214fb89252a028fb])

因为我不认为我可以参数化这样的对象

推荐答案

使用动态SQL EXECUTE.不幸的是,RedShift doesn'tformat()个(它是added in PostgreSQL 9.1,在RedShift从PostgreSQL 8.0.2派生出来之后的一段时间),所以在将列名注入语句之前,您需要使用quote_ident()个列名.

CREATE OR REPLACE PROCEDURE PCI_COLUMNS()
AS $$
DECLARE x RECORD;
BEGIN
    FOR x IN (SELECT quote_ident(col) AS quoted_column 
              FROM L_USA.COLUMNS WHERE TYPE = 'PCI')
    LOOP EXECUTE 
        'ATTACH MASKING POLICY COMMERCIAL_PCI' ||
        'ON L_USA.DEMO('||x.quoted_column||')' ||
        'USING ('||x.quoted_column||', CUST_ID)' ||
        'TO ROLE COMM_PCI' ||
        'PRIORITY 30;';
    END LOOP;
END;
$$ LANGUAGE plpgsql;

CALL PCI_COLUMNS();

Sql相关问答推荐

如何返回字符串中包含相同值的数据?

获取每5分钟时间间隔的总和

Postgres trunc_date删除一个月

在SQL中使用类别值将行转置为列

SQL子查询返回多个值错误

有没有办法在Postgres中存储带有时区的时间戳,而不将其转换为UTC

从包含PostgreSQL中的JSON值的列中提取列表或目录

在MS Access Modern图表的X轴上显示时间值时遇到问题

重用传递给 node 的参数-postgres upsert查询

如何为该查询编写正确分区依据

如何根据 SQL 中的阈值标记一个集群中的所有值?

如何为 ActiveRecord 联接应用附加条件

在where语句中使用CTE非常缓慢

如何根据共同列值从两个表中包含列,但只包含左表中的行

查询以查找今天和昨天的数据之间的差异以及伪列

函数调用作为插入值语句中的参数

T-SQL 查询计算日期在其他列中定义的日期之间绑定的行数

为每组填写行以进行旋转

为什么 Oracle 在一个查询中对同一张表同时执行 TABLE SCAN 和 INDEX UNIQUE SCAN?

奇怪的甲骨文行为