2

特定のテーブルの特定の行に値が表示されるかどうかを確認する関数を実装しました。

CREATE FUNCTION check_if_if_exist(id INTEGER, table_name character(50), table_column character(20) ) RETURNS BOOLEAN AS $$

DECLARE res BOOLEAN;

BEGIN 
    SELECT table_column INTO res
    FROM table_name 
    WHERE table_column = id;

    RETURN res;
END;

$$ LANGUAGE plpgsql

この関数を試すための簡単なテストテーブルを作成して入力しました:

CREATE TABLE tab(f INTEGER);

そして私は次のような関数を呼び出します

SELECT check_if_exist(10, tab, f);

しかし、私はこのエラーで発生します:

ERROR:  column "prova" does not exist
LINE 1: SELECT check_if_exist(10, tab, f);
                              ^


********** Error **********

ERROR: column "tab" does not exist
SQL state: 42703
Character: 27

なぜ?

4

2 に答える 2

4

Elmo の応答に加えて、型に注意する必要があります。あなたが持っている:

ERROR: column "tab" does not exist

tabSQL パーサーは、引用符なしでの処理方法を知らないためです。クエリは次のようにする必要があります。

SELECT check_if_exist(10, 'tab', 'f');

Elmoが答えたように、動的クエリを使用するため、引用しtabてもエラーが発生します:

ERROR:  relation "table_name" does not exist

EXECUTE例を使用できます。

CREATE OR REPLACE FUNCTION check_if_exist(id INTEGER, table_name varchar, table_column varchar) RETURNS BOOLEAN AS $$
    DECLARE
        sql varchar;
        cnt int;
    BEGIN 
        sql := 'SELECT count(*) FROM ' || quote_ident(table_name) || ' WHERE ' || quote_ident(table_column) || '=$1';
        RAISE NOTICE 'sql %', sql;
        EXECUTE sql USING id INTO cnt;
        RETURN cnt > 0;
    END;
$$ LANGUAGE plpgsql

関数の引数VARCHARの代わりに使用することも、デバッグ時に非常に便利な代わりに使用することもできます。character(N)CREATE OR REPLACE FUNCTION ...CREATE FUNCTION ...

于 2013-07-04T10:45:03.367 に答える
2

コードが機能する可能性はありません - PLPGSQL で異なるテーブルを扱う場合、動的クエリを利用する必要があるため、EXECUTE必要です - http://www.postgresql.org/docs/current/static/plpgsql-statements.html#PLPGSQL- STATEMENTS-EXECUTING-DYN
しかし、まず第一に - PostgreSQL を使用することに何も悪いことはありませんEXISTS- http://www.postgresql.org/docs/current/static/functions-subquery.html#AEN15284独自に発明する代わりに - あなたのパフォーマンスソリューションは、付属のバッテリーを使用するよりも大幅に悪化します...
うまくいけば、これは役に立ちます。幸運を。

于 2013-07-04T10:08:04.307 に答える