创建PL / SQL过程和序列时遇到问题

时间:2020-07-17 19:13:19

标签: sql oracle plsql

在这里,我有一个问题需要编写PL / SQL。数据库的结构也被链接。问题要求在过程中使用序列。我对此并不陌生,不知道它是否可以正常工作,并且我的exec命令似乎不起作用,请帮帮我。这也是如何查找序列应以的最大股东编号,还是可以在内部创建序列中进行选择?

编写一个称为INSERT_DIRECT_HOLDER的PL / SQL过程,该过程将用于插入新的直接持有人。创建一个序列以自动生成股东ID。在您的过程中使用此顺序。 -输入参数:first_name,last_name

DROP SEQUENCE shareholder_id_seq;

SELECT 
    MAX(shareholder_id)
FROM shareholder;

CREATE SEQUENCE shareholder_id_seq
   INCREMENT BY 1
   START WITH 25;

CREATE OR REPLACE PROCEDURE insert_direct_holder(
    p_first_name in direct_holder.first_name%type,
    p_last_name in direct_holder.last_name%type)
IS  
    v_shareholder_id NUMBER(6);
BEGIN
  INSERT INTO DIRECT_HOLDER(direct_holder_id,first_name,last_name) values(shareholder_id_seq.nextval, p_first_name, p_last_name);
  INSERT INTO shareholder (shareholder_id, type) VALUES (shareholder_id_seq.nextval,'Direct_Holder');
  COMMIT;
  END;
  /
/* test command*/
exec insert_direct_holder( p_first_name, p_last_name );

enter image description here

2 个答案:

答案 0 :(得分:0)

您需要在两个表中插入具有相同ID的记录。 另外,您需要先将记录插入到父表(股东)中,然后再插入子表(direct_holder)中。

    CREATE OR REPLACE PROCEDURE insert_direct_holder(
        p_first_name in direct_holder.first_name%type,
        p_last_name in direct_holder.last_name%type)
    IS  
        v_shareholder_id NUMBER(6);
    BEGIN
      v_shareholder_id := shareholder_id_seq.nextval;
      
      INSERT INTO shareholder (shareholder_id, type) VALUES (v_shareholder_id,'Direct_Holder');

      INSERT INTO DIRECT_HOLDER(direct_holder_id,first_name,last_name) values(v_shareholder_id, p_first_name, p_last_name);
      COMMIT;
    END;
    /

/* test command*/
exec insert_direct_holder( p_first_name, p_last_name );

答案 1 :(得分:0)

创建一次序列即可为任何数字列实现自动递增功能。 对于当前的用例,它只能创建一次,并希望永久保留。将来可以根据需要修改序列。

如果股东表中已经有记录,则创建起始值为csv.transform的序列,以避免违反主键约束。

由于该列与SELECT MAX(shareholder_id) + 1 FROM shareholder;具有外键关系,因此需要对存储过程使用相同的SHAREHOLDER.SHAREHOLDER_ID进行一些修改。

使用DIRECT_HOLDER插入相同顺序的两个表。nextval。

INSERT ALL

dbfiddle演示,其工作代码为https://dbfiddle.uk/?rdbms=oracle_18&fiddle=5d80488fb69d78d4b5087f06a5becf96