我正在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
答案 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;