如何将游标循环变量评估为 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 语句 SELECT
、INSERT
、UPDATE
和 DELETE
参数化。
但是标识符(或语法元素)不能在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?
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 语句 SELECT
、INSERT
、UPDATE
和 DELETE
参数化。
但是标识符(或语法元素)不能在SQL中的任何地方参数化。在 PL/pgSQL 中,您可以将动态 SQL 与 EXECUTE
一起使用,例如
为方便起见,可选择使用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?