oracle—创建pl/sql过程和序列时出现问题

yjghlzjz  于 2021-07-29  发布在  Java
关注(0)|答案(2)|浏览(411)

这里我有一个问题,我需要写一个pl/sql。数据库的结构也是相互联系的。这个问题需要在一个过程中使用一个序列。我是新来的,不知道这是否正常工作,我的exec命令似乎不工作,请帮助我。另外,这是如何查找序列应该从中开始的max/u id,还是我可以在create sequence中选择一个?
编写一个名为insert\u direct\u holder的pl/sql过程,用于插入新的direct holder。创建一个序列以自动生成用户ID。在程序中使用此顺序-输入参数:名、姓

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 );

mcdcgff0

mcdcgff01#

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

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 );
xurqigkl

xurqigkl2#

序列只创建一次,以实现任何数字列的自动递增功能。对于当前用例,它必须只创建一次,并且希望永远保留。如果需要,可以在将来修改序列。
如果股东表中已有记录,则创建起始值为的序列 SELECT MAX(shareholder_id) + 1 FROM shareholder; 以避免主键约束冲突。
存储过程需要稍加修改才能使用相同的方法 SHAREHOLDER.SHAREHOLDER_ID 因为列与 DIRECT_HOLDER .
使用 INSERT ALL 为同一序列插入两个表。nextval。

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  

 BEGIN

 INSERT ALL
 INTO SHAREHOLDER
  (shareholder_id, type) values(shareholder_id_seq.nextval,'Direct_Holder')
 INTO DIRECT_HOLDER
  (direct_holder_id,first_name,last_name) values 
 (shareholder_id_seq.nextval,p_first_name,p_last_name)
 SELECT 'DUMMY' FROM dual;

 COMMIT;

 END;
 /

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

相关问题