【问题标题】:How do I evaluate a cursor loop variable as a table name?如何将游标循环变量评估为表名?
【发布时间】:2021-09-09 16:22:11
【问题描述】:
FOR _r IN curs1 LOOP
    ALTER TABLE QUOTE_IDENT(_r.table_name) ALTER COLUMN company_uuid SET NOT NULL; 
END LOOP;

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

错误是:ERROR: syntax error at or near "("

【问题讨论】:

    标签: postgresql plpgsql dynamic-sql


    【解决方案1】:

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

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

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

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

    使用%I 标识符作为标识符,除非_r.table_name 已经被正确引用。见:

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-15
        • 2013-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-04
        • 2016-08-27
        • 1970-01-01
        相关资源
        最近更新 更多