簡體   English   中英

postgresql函數錯誤:列名不存在

[英]postgresql function error: column name does not exist

我已經實現了一個函數,用於檢查某個值是否出現在特定表的特定行中:

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

為什么?

您的代碼沒有機會工作 - 在處理PLPGSQL中的不同表時,您需要利用動態查詢,因此需要EXECUTE - http://www.postgresql.org/docs/current/static/plpgsql-statements.html#PLPGSQL -STATEMENTS執行的-DYN
但首先 - 使用PostgreSQL EXISTS - http://www.postgresql.org/docs/current/static/functions-subquery.html#AEN15284而不是發明自己的 - 沒有什么不好 - 你的解決方案的性能將是顯着的比使用附帶的電池更糟糕......
希望這很有幫助。 祝好運。

除了Elmo響應,你必須小心類型。 你必須:

ERROR: column "tab" does not exist

因為SQL解析器不知道如何處理沒有引用的tab 您的查詢必須如下:

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 ...這在調試時非常方便。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM