#sql #amazon-web-services #stored-procedures #amazon-redshift #plpgsql
#sql #amazon-веб-сервисы #хранимые процедуры #amazon-redshift #plpgsql
Вопрос:
Я пытаюсь протестировать свою хранимую процедуру в MySQL workbench / j. Я получаю сообщение об ошибке при попытке вызвать хранимую процедуру.
Я создал таблицу для хранения результата моей хранимой процедуры
CREATE TABLE IF NOT EXISTS ableok
(
name VARCHAR(50) ENCODE lzo
);
Это моя хранимая процедура:
CREATE OR REPLACE PROCEDURE sp_GetDistSchema()
AS '
BEGIN
SELECT table_schema INTO ableok FROM information_schema.tables;
END;
'
LANGUAGE plpgsql;
Вот как я вызываю свою хранимую процедуру в SQL workbench / j:
call sp_getdistschema();
Результат:
An error occurred when executing the SQL command:
call sp_getdistschema()
[Amazon](500310) Invalid operation: Column "table_schema" has unsupported type "information_schema.sql_identifier".; [SQL State=0A000, DB Errorcode=500310]
1 statement failed.
Ответ №1:
ВЫБОР … INTO structure используется для хранения результата запроса в переменных. Похоже, что вы действительно просто пытаетесь заполнить distTable напрямую. Попробуйте это вместо:
Обновление: При обработке информационной схемы в Redshift / PostgreSQL вам, по-видимому, необходимо преобразовать типы данных столбца с использованием CAST:
CREATE OR REPLACE PROCEDURE sp_GetDistSchema()
BEGIN
INSERT INTO distTable SELECT DISTINCT CAST(table_schema AS VARCHAR) FROM information_schema.tables;
END;
Комментарии:
1. При попытке этого я получаю новую ошибку: столбец » SELECT .table_schema» имеет неподдерживаемый тип «information_schema.sql_identifier». Функция «has_table_privilege (oid,текст)» не поддерживается. (Повторяется 7 раз). Недопустимая операция: указанные типы или функции (по одному на ИНФОРМАЦИОННОЕ сообщение) не поддерживаются в таблицах Redshift.; [Состояние SQL = 0A000, код ошибки DB = 500310]
2. Вы получаете какую-либо ошибку при запуске инструкции INSERT вне процедуры?
3. Да, та же ошибка: [Amazon] (500310) Недопустимая операция: указанные типы или функции (по одному на ИНФОРМАЦИОННОЕ сообщение) не поддерживаются в таблицах Redshift.; [Состояние SQL = 0A000, код ошибки DB = 500310]
4. Вы видели обновление исходного ответа и попробовали ПРИВЕДЕНИЕ?
5. Да, может быть, это потому, что information_schema выполняется в примечании к заголовку, в то время как запросы к обычным таблицам выполняются на вычислительном узле?
Ответ №2:
Как упоминал @user9601310 (проголосовал против), вам необходимо привести типы данных столбца.
Я тоже ломал голову, даже в простом старом Postgres, когда вы использовали information_schema.
Это будет «описывать» таблицу или представление, но не будет работать, если столбцы запроса не будут приведены как VARCHAR:
CREATE OR REPLACE FUNCTION public.fn_desc(p_tablename VARCHAR)
RETURNS TABLE(vtable_name VARCHAR, vcolumn_name VARCHAR, vdata_type VARCHAR)
LANGUAGE plpgsql
AS $function$
BEGIN
RETURN QUERY
SELECT
table_name::VARCHAR,
column_name::VARCHAR,
data_type::VARCHAR
FROM
information_schema.columns
WHERE
table_name ILIKE p_tablename;
END;
$function$
ВЫБЕРИТЕ * ИЗ public.fn_desc(‘any_table_or_view’);