【问题标题】:Column '' has unsupported type "information_schema.sql_identifier"列“”具有不受支持的类型“information_schema.sql_identifier”
【发布时间】:2020-09-14 05:29:44
【问题描述】:

我正在尝试在 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.

【问题讨论】:

    标签: sql amazon-web-services stored-procedures amazon-redshift plpgsql


    【解决方案1】:

    SELECT ... INTO 结构用于将查询结果存储到变量中。看起来您实际上只是想直接填充 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;
    

    【讨论】:

    • 尝试此操作时出现新错误:列“SELECT.table_schema”具有不受支持的类型“information_schema.sql_identifier”。不支持函数“has_table_privilege(oid,text)”。(重复 7 次)。无效操作:Redshift 表不支持指定的类型或函数(每个 INFO 消息一个)。 [SQL 状态=0A000,数据库错误代码=500310]
    • 在过程之外运行 INSERT 语句时是否出现任何错误?
    • 是同样的错误:[Amazon](500310) 无效操作:Redshift 表不支持指定的类型或函数(每条 INFO 消息一个)。 [SQL 状态=0A000,数据库错误代码=500310]
    • 您是否看到原始答案的更新并尝试 CAST?
    • 是的,会不会是因为information_schema 在leader note 上运行,而对普通表的查询在计算节点上运行?
    【解决方案2】:

    正如@user9601310 提到的(投票赞成),您需要对列数据类型进行 CAST。

    当您使用 information_schema 时,即使在普通的旧 Postgres 中,我也摸不着头脑。

    这将“描述”一个表或一个视图,但除非查询列被强制转换为 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$
    

    SELECT * FROM public.fn_desc('any_table_or_view');

    【讨论】:

      猜你喜欢
      • 2015-09-24
      • 1970-01-01
      • 2021-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-08
      • 2021-05-29
      相关资源
      最近更新 更多