Postgresql

SQL 錯誤428834288342883- 函式不存在 - 無法從觸發器呼叫函式

  • June 29, 2018

當表 1 插入一行時,我想在表 2 中插入一個新行。我為此創建了一個函式。但是,當我嘗試創建觸發器時,雖然創建了函式並且我可以看到該函式,但它給出了一個錯誤。

SQL Error [42883]: ERROR: function insertintoautoincrementexample() does not exist

以下是與之相關的詳細資訊。我嘗試使用一些文本參數創建觸發器,但沒有運氣。

//Table 1
CREATE TABLE myOriginalTable(
   companyName VARCHAR(15) PRIMARY KEY NOT NULL,
   location VARCHAR(30)    
);    

//Table 2    
CREATE TABLE autoincrementexample (
   entryid INT4 NOT NULL DEFAULT nextval('autoincrementexample_entryid_seq'::regclass),
   companyname VARCHAR(15) NOT NULL,
   location VARCHAR(30) NOT NULL,
   PRIMARY KEY (companyname)
);

//Function    
CREATE OR REPLACE FUNCTION insertIntoAutoIncrementExample(companyname text,location text)

   returns void
   language plpgsql
   as $function$

   declare
   varaudseq bigint;

   begin
       varaudseq :=0;

   begin
       SELECT NEXTVAL(autoincrementexample) INTO varaudseq;
       INSERT INTO autoincrementexample(companyname,location)VALUES(companyName,location);
   COMMIT;
   END;
   END;
   $function$;

//Trigger
CREATE TRIGGER after_insert_original 
   AFTER INSERT ON myoriginaltable
   FOR EACH row
   EXECUTE PROCEDURE insertintoautoincrementexample();

對此有任何幫助將不勝感激。

正如文件所說:

必須先定義觸發器函式,然後才能創建觸發器本身。觸發器函式必須聲明為不帶參數並返回類型觸發器的函式。(觸發器函式通過特殊傳遞的 TriggerData 結構接收其輸入,而不是以普通函式參數的形式。)

您聲明的功能是:

insertIntoAutoIncrementExample(companyname text,location text) ... returns void

所以它不適合返回類型和參數類型。觸發器函式不接受參數,但可以訪問在行變數中插入或更改的值NEWOLD. 它們在 plpgsql 中自動定義,有關詳細資訊和範例,請參閱plpgsql 章節中的觸發過程

關於錯誤消息:

function insertintoautoincrementexample() does not exist

這意味著:這個帶有空參數列表的函式名不存在。括號的存在是相關的,因為在 postgresql 中,函式總是與它們的參數類型一起使用: 與, or orfoobar(int)不同的函式。foobar()``foobar(int,int)``foobar(text)

引用自:https://dba.stackexchange.com/questions/194159