【问题标题】:Functions and Triggers in PostgreSqlPostgreSql 中的函数和触发器
【发布时间】:2016-01-21 23:18:57
【问题描述】:

由于我是 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.

【问题讨论】:

  • 嗯,关于postgresql你首先应该知道的是它不是mysql、sql-server、sqlite也不是sqlite3...
  • 您是要分享您的函数到底出了什么问题,还是我们自己猜?
  • @Shadow,如果您需要有关触发器的帮助,请在问题中添加更多详细信息。目前还不清楚你需要什么样的触发器。
  • @TommasoDiBucchianico 我不是 OP。
  • @Mohammed,如果您需要有关触发器的帮助,请在问题中添加更多详细信息。目前还不清楚你需要什么样的触发器。

标签: postgresql


【解决方案1】:

您的函数的问题是您尝试使用变量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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多