Database-Design

循環遍歷表類型變數

  • February 27, 2013

我有一個具有表類型參數的函式,我想遍歷所有欄位並返回具有空值或空值的列。

CREATE OR REPLACE FUNCTION toned.function_validate(varmember tbl_member)
 RETURNS text AS
$BODY$
...

tbl_member下面的定義

CREATE TABLE toned.tbl_member
(
 code smallint NOT NULL DEFAULT nextval('toned.seq_code'::regclass),
 name text NOT NULL,
 email text,
 address text,
 city text,
 country text
);

誰能幫我遍歷變數?我不知道如何引用欄位名稱。我可以做類似的事情varmember[0]嗎?

通常我會盡可能多地使用表定義中的聲明性內容。如果我不能只相信我的應用程序能夠正常檢測和處理標準異常,那麼我可以使用異常塊。

由於 plpgsql 表達能力的限制,在 plpgsql 中做你想做的事情可能會非常困難。雖然我們可以找到屬性,但如果不求助於臨時表等,就不可能生成查詢來檢查它們。所以讓我們談談臨時表作為一種選擇。你可以:

CREATE TEMPORARY TABLE temp_tblmember OF TYPE toned.tbl_member;

然後你可以將它插入到那個臨時表中。

然後您可以在 pg_attribute 中查找屬性(在 pg_attribute.relid = pg_class.oid 上加入 pg_class)。然後你可以使用 EXECUTE 來檢查屬性。

不幸的是,這不太可能表現得很好,並且編碼可能非常麻煩。

幸運的是,您可以考慮使用 pl/perl 進行循環,您可以在其中訪問,然後循環遍歷 hashref 的鍵。

CREATE OR REPLACE FUNCTION validate(tbl_member) returns int immutable language plperl as
$$
 my ($ref) = @_;
 for my $k (keys %$ref){
     if (!defined $ref->{$k}){
         elog(ERROR, 'tbl_member.' . $k . ' not defined!');
      }
 }
  return 1;
$$;

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