簡體   English   中英

PL / PgSQL動態子查詢

[英]PL/PgSQL Dynamic Subqueries

我正在創建一個運行檢查的觸發器,如果​​通過則引發異常。 為此,我需要使用動態調用,因為我只將表名作為字符串。 我正在使用PostgreSQL,但我不知道執行命令的工作方式。 當我這樣做時:

CREATE OR REPLACE FUNCTION bleep() RETURNS table(id INT) AS $bleep$
  BEGIN
    RETURN QUERY EXECUTE 'SELECT (id) from Applicant';
  END;
$bleep$ LANGUAGE plpgsql;

SELECT * from bleep();

它運行完美,我從申請人那里獲得了ID表。 但是當我這樣做時:

CREATE OR REPLACE FUNCTION bleep() RETURNS BOOLEAN AS $bleep$
  BEGIN
    IF (EXISTS (EXECUTE 'SELECT (id) from Applicant')) THEN
      RETURN TRUE;
    ELSE
      RETURN FALSE;
    END IF;
  END;
$bleep$ LANGUAGE plpgsql;

它告訴我:

錯誤:“ EXECUTE”處或附近的語法錯誤:87

這只是一個玩具示例,目的是弄清楚它是如何工作的,並且我閱讀了許多文檔和指南。 如果我能弄清楚這個玩具示例,則可以使完整的觸發器工作,因為我嘗試對表名進行硬編碼。 我該如何進行這項工作?

CREATE OR REPLACE FUNCTION bleep() RETURNS BOOLEAN AS $bleep$
  DECLARE
        res bool;
  BEGIN
    EXECUTE 'SELECT exists (select 1 from Applicant)' INTO res;
    return res;
  END;
$bleep$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION bleep() RETURNS BOOLEAN AS $bleep$
  BEGIN
    return query EXECUTE 'SELECT exists (select 1 from Applicant)';
  END;
$bleep$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION bleep() RETURNS 
BOOLEAN AS $bleep$
  BEGIN
    IF (EXISTS (SELECT id from Applicant)) THEN
      RETURN TRUE;
    ELSE
      RETURN FALSE;
    END IF;
  END;
$bleep$ LANGUAGE plpgsql;

我誤解了你的問題。 這個怎么樣?

CREATE FUNCTION bleep(integer) RETURNS boolean
    AS 'select case when count(*) = 0 then false else true end from Applicant where id = $1;'
LANGUAGE SQL
IMMUTABLE
RETURNS NULL ON NULL INPUT;

您可以通過SQLFiddle進行測試: http ://sqlfiddle.com/#!15/33954/1

暫無
暫無

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

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