Столбец » имеет неподдерживаемый тип «information_schema.sql_identifier»

#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’);