基于不同字段的

时间:2016-03-15 13:58:02

标签: oracle plsql

我知道SQL Server。在一个使用Oracle的项目上,并且有时间做事。我目前的问题是我们有一个类似于以下内容的表:

ACCOUNT_ID   NUMBER
SEQUENCE_ID  NUMBER
DISPLAY_NAME VARCHAR2
TOKEN        VARCHAR2
PAYMENT_TYPE NUMBER

Account_ID可以在此表中多次出现。我需要的是Sequence_ID需要为每个Account_ID唯一递增。所以看起来像这样。

ACCOUNT_ID    SEQUENCE_ID    DISPLAY_NAME    TOKEN    PAYMENT_TYPE
------------------------------------------------------------------
111111        1              Primary         abcd     1
222222        1              Primary         bcde     1
222222        2              Secondary       dffs     1
333333        1              Default         fdsf     2
111111        2              Alternate       sfff     2
222222        3              Another         slsl     1

如您所见,Account_ID为11111有2条记录,Sequence_ID不会重复该Account_ID。基本上,Sequence_ID是自动递增的,但对于每个Account_ID都是唯一的。

这可能吗?

3 个答案:

答案 0 :(得分:2)

您可以将所有逻辑封装在一个过程中:

CREATE OR REPLACE PROCEDURE create_Account(
  in_account_id    IN ACCOUNTS.ACCOUNT_ID%TYPE,
  in_display_name  IN ACCOUNTS.DISPLAY_NAME%TYPE,
  in_token         IN ACCOUNTS.TOKEN%TYPE,
  in_payment_type  IN ACCOUNTS.PAYMENT_TYPE%TYPE
)
AS
  p_seq_id ACCOUNTS.SEQUENCE_ID%TYPE;
BEGIN
  SELECT COUNT(*) + 1
  INTO   p_seq_no
  FROM   ACCOUNTS
  WHERE  ACCOUNT_ID = in_account_id;

  INSERT INTO ACCOUNTS (
    account_id,
    sequence_id,
    display_name,
    token,
    payment_type
  ) VALUES (
    in_account_id,
    p_seq_id,
    in_display_name,
    in_token,
    in_payment_type
  );
END;
/

或者你可以使用INSERT

INSERT INTO ACCOUNTS
SELECT :account_id,
       COUNT(*) + 1,
       :display_name,
       :token,
       :payment_type
FROM   ACCOUNTS
WHERE  account_id = :account_id;

答案 1 :(得分:0)

我认为最容易解决问题的方法是在桌面上创建一个触发器,如下所示:

<script src="http://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"></script>

答案 2 :(得分:0)

  

如上面的答案所示,你可以使用Procedure来   做这个。如果您不想使用过程中的所有内容,则可以使用   函数,因为您可以以任何方式使用函数的返回值。希望这个   帮助

CREATE OR REPLACE FUNCTION create_Account(
  in_account_id    IN ACCOUNTS.ACCOUNT_ID%TYPE,
  in_display_name  IN ACCOUNTS.DISPLAY_NAME%TYPE,
  in_token         IN ACCOUNTS.TOKEN%TYPE,
  in_payment_type  IN ACCOUNTS.PAYMENT_TYPE%TYPE
)
RETURN PLS_INTEGER
AS
  p_seq_id ACCOUNTS.SEQUENCE_ID%TYPE;
BEGIN
  SELECT COUNT(*) + 1
  INTO   p_seq_no
  FROM   ACCOUNTS
  WHERE  ACCOUNT_ID = in_account_id;

RETURN p_seq_no;
END;