エラーを再現できないため、質問から外れると思われます。ここではそれが動作する例を示します。
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;
は、関数を作成します:
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_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;
は、アクション内の関数であります改訂された質問*******
文字列にブール値を連結するにはどうすればよいですか?答え、あなたはできません。文字列である変数を作成し、ブール値に基づいて値を設定する必要があります。
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;
どのように関数を呼び出していますか?関数は何を返しますか?列はどのデータ型ですか?通知によって提起されたSQLを実行すると機能しますか? –
1. function_name( 'value')を選択します。 2.関数が返すブール 3.カラムのデータ型Boolean(入力パラメータ から取得しています)4. SQLを変数にバインドする際にraise noticeを実行する前にコードがアボートされます。 – Pra