如何减少存储过程中的重复?

时间:2011-12-05 17:58:01

标签: sql postgresql stored-procedures

作为我的第一个plpgsql编码,我编写了下面的代码,这在我看来有很多重复。我怎样才能摆脱重复?

CREATE TABLE devices (
  device SERIAL PRIMARY KEY NOT NULL,
  fingerprint VARCHAR UNIQUE NOT NULL
);

CREATE TABLE guests (
  guest SERIAL PRIMARY KEY NOT NULL,
  uuid CHAR(36) NOT NULL
);

CREATE TABLE vms (
  vm SERIAL PRIMARY KEY NOT NULL,
  guest SERIAL REFERENCES guests(guest),
  device SERIAL REFERENCES devices(device),
  name VARCHAR NOT NULL  
);

CREATE OR REPLACE FUNCTION got_device_guest(fp TEXT, vmuuid CHAR(36), vmname TEXT) RETURNS VOID AS $BODY$
DECLARE
  deviceid INT;
  guestid INT;
BEGIN
  IF NOT EXISTS(SELECT * FROM devices WHERE devices.fingerprint = fp) THEN
    INSERT INTO devices(fingerprint) VALUES (fp);
  END IF;
  SELECT device INTO deviceid FROM devices WHERE devices.fingerprint = fp;
  IF NOT (EXISTS(SELECT * FROM guests WHERE guests.uuid = vmuuid)) THEN
    INSERT INTO guests(uuid) VALUES (vmuuid);
  END IF;
  SELECT guest INTO guestid FROM guests WHERE guests.uuid = vmuuid;
  IF NOT (EXISTS(SELECT * FROM vms WHERE vms.guest = guestid AND vms.device=deviceid)) THEN
    INSERT INTO vms(guest, device, name) VALUES (guestid, deviceid, vmname);
  END IF;
END;
$BODY$ LANGUAGE plpgsql;

1 个答案:

答案 0 :(得分:2)

我根本没有看到重复。所有语句都在不同列上插入数据,等等。分享那些公共if not exists select ...(以及在你的语句中看起来类似的任何其他东西)的唯一方法是通过构造动态SQL,这对此不好。案件。

原因是一个坏主意是你可能会暴露自己的SQL注入攻击,并且你的proc的执行计划不会被重用等等。我会保留原样。