创建动态表时出错:(数组值必须以“{”或维度信息开头)

时间:2017-06-21 06:54:49

标签: dynamic-sql greenplum

我正在Greenplum中创建一个动态表。

下面是我的代码,其中传递了两个变量i_colname和i_tablename。

v_sql := 'CREATE TEMPORARY TABLE Updates AS (SELECT A.*,'||i_colname||' AS IS_FLAG FROM '||i_tablename||' A WHERE LOWER(TRIM(a.col12)) = ''rtp'') DISTRIBUTED RANDOMLY';

raise notice '%', v_sql;

execute v_sql;

但是我无法理解为什么我得到以下错误,即使我传递的表名没有任何数组数据类型列。如果我从动态查询中删除i_colname,那么它的工作正常。

  

错误:(数组值必须以“{”或维度信息开头)   SQL状态:P0001

1 个答案:

答案 0 :(得分:0)

我无法重现您的错误,所以我认为这是您不可能做到的。这是一个工作的例子。

CREATE TABLE test_table
(
  id integer,
  bar text,
  col12 text,
  bool boolean
)
DISTRIBUTED BY (id);

插入一些数据:

INSERT INTO test_table 
SELECT i AS id, 'foo_' || i AS bar, 
       'rtp'::text AS col12, true AS bool 
FROM generate_series(1, 100) AS i;

创建功能:

CREATE OR REPLACE FUNCTION fn_test(p_colname text, p_tablename text)
  RETURNS boolean AS
$$
declare
    v_sql text;
begin
    v_sql := 'CREATE TEMPORARY TABLE Updates AS (SELECT A.*,' || p_colname || 
             ' AS IS_FLAG FROM ' || p_tablename || 
             ' A WHERE LOWER(TRIM(a.col12)) = ''rtp'') DISTRIBUTED RANDOMLY';

    raise notice '%', v_sql;

    execute v_sql;

    return true;
exception
    when others then
        raise exception '(%)', sqlerrm;
end;
$$
  LANGUAGE plpgsql;

以下是行动中的功能:

gpadmin=# SELECT fn_test('bool', 'test_table');
NOTICE:  CREATE TEMPORARY TABLE Updates AS (SELECT A.*,bool AS IS_FLAG FROM test_table A WHERE LOWER(TRIM(a.col12)) = 'rtp') DISTRIBUTED RANDOMLY
 fn_test 
---------
 t
(1 row)

*******修订问题*******

如何在字符串中连接布尔值?回答,你不能。您必须创建一个字符串变量并根据布尔值设置值。

CREATE OR REPLACE FUNCTION fn_test(p_tablename text, p_ind boolean)
  RETURNS boolean AS
$$
declare
    v_sql text;
    v_true_false text;
begin
    if p_ind then
        v_true_false := 'true';
    else
        v_true_false := 'false';
    end if;

    v_sql := 'CREATE TEMPORARY TABLE Updates AS (SELECT A.*,' || v_true_false || 
         ' AS IS_FLAG FROM ' || p_tablename || 
         ' A WHERE LOWER(TRIM(a.col12)) = ''rtp'') DISTRIBUTED RANDOMLY';

    raise notice '%', v_sql;

    execute v_sql;

    return true;
exception
    when others then
    raise exception '(%)', sqlerrm;
end;
$$
  LANGUAGE plpgsql;