2017-06-21 15 views
0

私はGreenplumで動的テーブルを作成しています。動的テーブルの作成中にエラーが発生しました:(配列値は「{」または次元情報で始まる必要があります)

以下は、2つの変数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を削除すると、うまく動作します。

ERROR: (array value must start with "{" or dimension information) SQL state: P0001

+0

どのように関数を呼び出していますか?関数は何を返しますか?列はどのデータ型ですか?通知によって提起されたSQLを実行すると機能しますか? –

+0

1. function_name( 'value')を選択します。 2.関数が返すブール 3.カラムのデータ型Boolean(入力パラメータ から取得しています)4. SQLを変数にバインドする際にraise noticeを実行する前にコードがアボートされます。 – Pra

答えて

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; 

は、関数を作成します:

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; 
+0

関数の入力パラメータの順序とデータ型を変更してください。平均 関数の作成または置換fn_test(p_tablename text、p_colname boolean) このように実行します SELECT fn_test( 'test_table'、 'True'); エラーが発生します。 – Pra

+0

'true'を渡すことでテキストをブール値に暗黙的に変換しようとしているときに、そのブール値を受け取り、それを別の暗黙的変換で文字列に変換しようとしています。どうして? –

+0

私もそれをSELECT fn_test( 'test_table'、True)として実行します。それでもそれは間違いです。私は入力パラメータTRUEまたはFALSEとしてブール値を渡すことができる関数を作成したいだけで、動的クエリでそれを使用して列を作成することができます。 – Pra

関連する問題