在这里,我有一个问题需要编写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 );
答案 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