Могу ли я узнать, как вызвать массив в хранимой процедуре? Я попытался заключить его в скобку, чтобы указать имя столбца, которое нужно вставить в новую таблицу.
CREATE OR REPLACE PROCEDURE data_versioning_nonull(new_table_name VARCHAR(100),column_name VARCHAR(100)[], current_table_name VARCHAR(100))
language plpgsql
as $$
BEGIN
EXECUTE ('CREATE TABLE ' || quote_ident(new_table_name) || ' AS SELECT ' || quote_ident(column_name) || ' FROM ' || quote_ident(current_table_name));
END $$;
CALL data_versioning_nonull('sales_2019_sample', ['orderid', 'product', 'address'], 'sales_2019');
Во-первых, измените хранимую процедуру, чтобы преобразовать выбранные столбцы из массива в csv следующим образом.
CREATE OR REPLACE PROCEDURE data_versioning_nonull(new_table_name VARCHAR(100),column_name VARCHAR(100)[], current_table_name VARCHAR(100))
language plpgsql
as $$
BEGIN
EXECUTE ('CREATE TABLE ' || quote_ident(new_table_name) || ' AS SELECT ' || array_to_string(column_name, ',') || ' FROM ' || quote_ident(current_table_name));
END $$;
Затем назовите это как:
CALL data_versioning_nonull('sales_2019_sample', '{"orderid", "product", "address"}', 'sales_2019');
quote_ident()
на %I
в одном тексте, а не в серии связанных фрагментов. %1$I
позволяет повторно использовать первый аргумент.ARRAY['a','b','c']::VARCHAR(100)[]
, чтобы явно сделать его массивом желаемого типа. '{"a","b","c"}'::VARCHAR(100)[]
тоже работает.CREATE TABLE sales_2019(orderid INT,product INT,address INT);
CREATE OR REPLACE PROCEDURE data_versioning_nonull(
new_table_name TEXT,
column_names TEXT[],
current_table_name TEXT)
LANGUAGE plpgsql AS $$
DECLARE
list_of_columns_as_quoted_identifiers TEXT;
BEGIN
SELECT string_agg(quote_ident(name),',')
INTO list_of_columns_as_quoted_identifiers
FROM unnest(column_names) name;
EXECUTE format('CREATE TABLE %1$I.%2$I AS SELECT %3$s FROM %1$I.%4$I',
current_schema(),
new_table_name,
list_of_columns_as_quoted_identifiers,
current_table_name);
END $$;
CALL data_versioning_nonull(
'sales_2019_sample',
ARRAY['orderid', 'product', 'address']::text[],
'sales_2019');
current_schema()
. Вы можете добавить параметры new_table_schema
и current_table_schema
, и если большую часть времени вы не ожидаете, что они будут использоваться, вы можете для удобства скрыть их за перегрузками процедур, используя current_schema()
, чтобы сохранить неявное поведение. Демо
Ошибка :( хотя эти три в массиве являются существующими столбцами в таблице sales_2019
ERROR: column "{"orderid", "product", "purchaseaddress"}" does not exist