PostgreSql中的函数和触发器

时间:2016-01-21 13:27:52

标签: postgresql

由于我是DB的新手,我正在学习PostgreSql,并且我正在尝试使用移动充值数据库系统的小方案。以下是我的查询。我想知道我写的函数有什么问题,它应该只返回一个帐号的余额,这只是客户ID。

而且,当我们添加一些值时,我还想在钱包表中添加值(这是一种充值类型)。

请帮帮我。感谢。

以下是完整的查询:

CREATE DATABASE "RECHARGESYS"
  WITH OWNER = postgres
       ENCODING = 'UTF8'
       TABLESPACE = pg_default
       LC_COLLATE = 'English_United States.1252'
       LC_CTYPE = 'English_United States.1252'
   CONNECTION LIMIT = -1;

--SERVICEPROVIDER TABLE:
DROP TABLE SERVICE_PROVIDERS;

CREATE TABLE SERVICE_PROVIDERS
(
SPID VARCHAR(5) PRIMARY KEY CHECK(SPID LIKE 'S%'),
SPNAME VARCHAR(50)
);

--CUSTOMER TABLE:
DROP TABLE CUSTOMER;

CREATE TABLE CUSTOMER
(
CID INT PRIMARY KEY,
CNAME VARCHAR(50)
);

--RECHARGE TABLE:
DROP TABLE RECHARGE;

CREATE TABLE RECHARGE
(
RID INT PRIMARY KEY,
CID INT REFERENCES CUSTOMER(CID),
SPID VARCHAR(5) REFERENCES SERVICE_PROVIDERS(SPID) CHECK(SPID LIKE 'S%'),
RENUMBER BIGINT,
AMOUNT INT
);

--TRANSACTION TABLE:
DROP TABLE TRANSACTION;

CREATE TABLE TRANSACTION
(
TID INT PRIMARY KEY,
SPID VARCHAR(5) REFERENCES SERVICE_PROVIDERS(SPID) CHECK(SPID LIKE('S%')),
RID INT REFERENCES RECHARGE(RID)
);

--WALLET TABLE:
DROP TABLE WALLET;

CREATE TABLE WALLET
(
WID INT PRIMARY KEY,
CID INT REFERENCES CUSTOMER(CID),
WAMOUNT INT
);

INSERT INTO SERVICE_PROVIDERS VALUES ('S1001', 'AIRTEL');
INSERT INTO SERVICE_PROVIDERS VALUES ('S1002', 'AIRCEL');
INSERT INTO SERVICE_PROVIDERS VALUES ('S1003', 'TATA DOCOMO');
INSERT INTO SERVICE_PROVIDERS VALUES ('S1004', 'IDEA');
INSERT INTO SERVICE_PROVIDERS VALUES ('S1005', 'VODAFONE');

SELECT * FROM SERVICE_PROVIDERS;

INSERT INTO CUSTOMER VALUES('20001','AHMED');
INSERT INTO CUSTOMER VALUES('20002','ASIF');
INSERT INTO CUSTOMER VALUES('20003','AHSRAF');
INSERT INTO CUSTOMER VALUES('20004','MAHESH');
INSERT INTO CUSTOMER VALUES('20005','ARUN');

SELECT * FROM CUSTOMER;

INSERT INTO WALLET VALUES('30001','20001','1000');
INSERT INTO WALLET VALUES('30002','20002','1000');
INSERT INTO WALLET VALUES('30003','20003','1000');
INSERT INTO WALLET VALUES('30004','20004','1000');
INSERT INTO WALLET VALUES('30005','20005','1000');


SELECT * FROM WALLET;

--IN THIS FUNCTION I WANT TO CHECK THE BALANCE ONCE I GIVE THE ACCOUNT NUMBER / CUSTOMER ID (ID):

CREATE OR REPLACE FUNCTION BALANCE(ACCNO INT)
RETURNS INT AS $BAL$
BEGIN
SELECT WAMOUNT INTO BAL FROM WALLET WHERE CID=ACCNO;
RETURN(BAL);
END;
$BAL$ LANGUAGE plpgsql;

SELECT BALANCE('20001') FROM WALLET;

--ALSO I WANT TRIGGER THAT CAN ADD AMOUNT TO THE WALLET.

1 个答案:

答案 0 :(得分:0)

您的功能问题在于您尝试使用变量BAL而未声明它:

CREATE OR REPLACE FUNCTION BALANCE(ACCNO INT)
RETURNS INT AS $BAL$ 
declare BAL integer; --<--- Add this line
.......

但是对于简单的选择查询,您不需要plpgsql函数。一个sql函数可以完成这项工作:

CREATE OR REPLACE FUNCTION balance(ACCNO INT)
RETURNS INT AS $$     
  SELECT wamount FROM wallet WHERE cid=ACCNO;
$$ LANGUAGE sql;