如何将游标循环变量评估为 table 名称?

How do I evaluate a cursor loop variable as a table name?

FOR _r IN curs1 LOOP
    ALTER TABLE QUOTE_IDENT(_r.table_name) ALTER COLUMN company_uuid SET NOT NULL; 
END LOOP;

我正在尝试将 table 名称转换为标识符,以便我可以动态地使用它。

错误是:错误:“(”处或附近的语法错误

貌似在命令中使用函数是无效的。您可以改用动态 sql。

EXECUTE 'ALTER TABLE ' || QUOTE_IDENT(_r.table_name) || ' ALTER COLUMN company_uuid SET NOT NULL;';

Values 可以为核心 DML 语句 SELECTINSERTUPDATEDELETE 参数化。

但是标识符(或语法元素)不能在SQL中的任何地方参数化。在 PL/pgSQL 中,您可以将动态 SQL 与 EXECUTE 一起使用,例如 。即,将整个命令连接为 string 然后执行。参见:

为方便起见,可选择使用format()

EXECUTE format('ALTER TABLE %I ALTER COLUMN company_uuid SET NOT NULL', _r.table_name);

使用标识符的 %I 说明符,除非 _r.table_name 已经被正确引用。参见:

  • Format specifier for integer variables in format() for EXECUTE?