Sql 如何使用过程填充数据库
我有大约15个不同的表,其中填充了不同的数据和不同的实体关系 我需要创建一个脚本,用这些表的内容填充我的数据库 脚本完成后,我在cmd中运行它,使用sqlplus和稍后的文件启动路径 我有两个不同的sql文件,一个名为db_spec.sql,另一个名为db_body.sql 在我的db_body.sql中,我创建了一个过程来存储具有1:N关系的两个表中的数据 第一个表格Sql 如何使用过程填充数据库,sql,database,oracle,entity-relationship,create-table,Sql,Database,Oracle,Entity Relationship,Create Table,我有大约15个不同的表,其中填充了不同的数据和不同的实体关系 我需要创建一个脚本,用这些表的内容填充我的数据库 脚本完成后,我在cmd中运行它,使用sqlplus和稍后的文件启动路径 我有两个不同的sql文件,一个名为db_spec.sql,另一个名为db_body.sql 在我的db_body.sql中,我创建了一个过程来存储具有1:N关系的两个表中的数据 第一个表格 CREATE TABLE LOCATION ( ID_LOCATION INTEGER NOT NULL, LOCATION_
CREATE TABLE LOCATION (
ID_LOCATION INTEGER NOT NULL,
LOCATION_NAME VARCHAR2 (20) NOT NULL,
POSTCODE INTEGER NOT NULL
);
ALTER TABLE LOCATION
ADD (CONSTRAINT PK_LOCATION PRIMARY KEY (ID_LOCATION));
CREATE TABLE ADDRESS (
ID_ADDRESS INTEGER NOT NULL,
STREET VARCHAR2 (20) NOT NULL,
HOUSE_NUMBER INTEGER NOT NULL,
FK_ID_LOCATION INTEGER NOT NULL
);
ALTER TABLE ADDRESS
ADD (CONSTRAINT PK_ADRESS PRIMARY KEY (ID_ADRESS));
ALTER TABLE ADRESS
ADD (CONSTRAINT FK_ADRESS_ID_LOCATION FOREIGN KEY
(FK_ID_LOCATION) REFERENCES LOCATION(ID_LOCATION));
第二张表
CREATE TABLE LOCATION (
ID_LOCATION INTEGER NOT NULL,
LOCATION_NAME VARCHAR2 (20) NOT NULL,
POSTCODE INTEGER NOT NULL
);
ALTER TABLE LOCATION
ADD (CONSTRAINT PK_LOCATION PRIMARY KEY (ID_LOCATION));
CREATE TABLE ADDRESS (
ID_ADDRESS INTEGER NOT NULL,
STREET VARCHAR2 (20) NOT NULL,
HOUSE_NUMBER INTEGER NOT NULL,
FK_ID_LOCATION INTEGER NOT NULL
);
ALTER TABLE ADDRESS
ADD (CONSTRAINT PK_ADRESS PRIMARY KEY (ID_ADRESS));
ALTER TABLE ADRESS
ADD (CONSTRAINT FK_ADRESS_ID_LOCATION FOREIGN KEY
(FK_ID_LOCATION) REFERENCES LOCATION(ID_LOCATION));
现在我需要使用数据填充它们。比方说
地点\ u NAME=“伦敦”
POSTOCDE=“394505”…等等
我已经创建了这个脚本,但在运行它时,没有显示任何内容,因此它显然存在一些错误
db_spec.sql脚本
CREATE OR REPLACE PACKAGE apartment AS
PROCEDURE fill_location(location_number NUMBER);
PROCEDURE fill_address(number_of_addresses NUMBER);
END apartment;
SET SERVEROUTPUT ON
SET LINESIZE 400
SET TIMING ON
CREATE OR REPLACE PACKAGE BODY address AS
PROCEDURE fill_location(location_number NUMBER) IS
p_location_name VARCHAR2(20);
p_postcode NUMBER (10,2);
BEGIN
FOR num IN 1..location_number LOOP
p_location_name := 'Location';
p_postcode := dbms_random.value(1000,9600);
p_postcode := p_postcode ||' '|| TO_CHAR(num);
INSERT INTO LOCATION (ID_LOCATION, LOCATION, POSTCODE)
VALUES (num, p_location_name, p_postcode);
dbms_output.put_line(num);
END LOOP;
END fill_location;
PROCEDURE fill_address(number_of_adresses NUMBER)IS
p_street_name VARCHAR(20);
p_house_number NUMBER (10,2);
p_id_address NUMBER(10);
CURSOR data IS
SELECT ID_LOCATION
FROM LOCATION;
BEGIN
FOR num_loop IN data LOOP
FOR num IN 1..number_of_adresses LOOP
p_street_name := 'Ulica';
p_house_number := dbms_random.value(1,99);
p_street_name := p_street_name ||' '|| TO_CHAR(num);
SELECT NVL(MAX(p_id_address)+1,1)
INTO p_id_address
FROM ADDRESS;
INSERT INTO ADDRESS (ID_ADDRESS, FK_ID_LOCATION, STREET, HOUSE_NUMBER)
VALUES (p_id_address, num_loop.ID_LOCATION, p_street_name, p_house_number);
dbms_output.put_line(num_loop.ID_LOCATION);
END LOOP;
END LOOP;
END fill_address;
END;
SHOW ERRORS;
db_body.sql脚本
CREATE OR REPLACE PACKAGE apartment AS
PROCEDURE fill_location(location_number NUMBER);
PROCEDURE fill_address(number_of_addresses NUMBER);
END apartment;
SET SERVEROUTPUT ON
SET LINESIZE 400
SET TIMING ON
CREATE OR REPLACE PACKAGE BODY address AS
PROCEDURE fill_location(location_number NUMBER) IS
p_location_name VARCHAR2(20);
p_postcode NUMBER (10,2);
BEGIN
FOR num IN 1..location_number LOOP
p_location_name := 'Location';
p_postcode := dbms_random.value(1000,9600);
p_postcode := p_postcode ||' '|| TO_CHAR(num);
INSERT INTO LOCATION (ID_LOCATION, LOCATION, POSTCODE)
VALUES (num, p_location_name, p_postcode);
dbms_output.put_line(num);
END LOOP;
END fill_location;
PROCEDURE fill_address(number_of_adresses NUMBER)IS
p_street_name VARCHAR(20);
p_house_number NUMBER (10,2);
p_id_address NUMBER(10);
CURSOR data IS
SELECT ID_LOCATION
FROM LOCATION;
BEGIN
FOR num_loop IN data LOOP
FOR num IN 1..number_of_adresses LOOP
p_street_name := 'Ulica';
p_house_number := dbms_random.value(1,99);
p_street_name := p_street_name ||' '|| TO_CHAR(num);
SELECT NVL(MAX(p_id_address)+1,1)
INTO p_id_address
FROM ADDRESS;
INSERT INTO ADDRESS (ID_ADDRESS, FK_ID_LOCATION, STREET, HOUSE_NUMBER)
VALUES (p_id_address, num_loop.ID_LOCATION, p_street_name, p_house_number);
dbms_output.put_line(num_loop.ID_LOCATION);
END LOOP;
END LOOP;
END fill_address;
END;
SHOW ERRORS;
你们能帮我解决这个问题吗,这样代码就能正常运行了?欢迎您的任何意见强>
顺便说一句,oprema_stanovanja.polni_kraj=地址。填写位置
除非我错过了<代码>提交代码>
根据您发布的屏幕截图,在正文和过程定义的末尾添加一个
/
。首先,发布的包编译时不会没有错误
您需要首先修复以下问题:
结束循环
END
LOCATION
列名和PL/SQL变量具有相同的名称。Oracle无法解析要在插入中的位置使用的内容]fill\u位置
过程。对于另一个程序,也应进行类似操作
create or replace package body apartment as
procedure fill_location(location_number number) is
p_location_name varchar2(20);
p_postcode number(10,2);
begin
for num in 1.. location_number loop
p_location_name := 'location';
p_postcode := dbms_random.value(1000,9600);
p_location_name := p_location_name ||' '|| to_char(num);
insert into location (id_location, location_name, postcode)
values (num, p_location_name, p_postcode);
dbms_output.put_line(num);
end loop;
end fill_location;
修复上述错误/建议,直到获得“成功编译PL/SQL”。如果您得到“带错误编译”,请使用“显示错误”查找并修复任何其他错误 您是否缺少提交?@StevieG我正在使用sqlplus运行cmd中的代码。什么也没发生。你能检查一下编辑过的帖子吗?你说的是
oprema\u stanovanja.polni\u kraj=地址。填写位置。那不应该是公寓。填写位置而不是地址。填写位置?如果这是一个输入错误,您是否检查了运行该过程后是否填充了位置表?你在期待什么?我是对的,我只是写错了。如何检查表中的数据?抱歉,这是我第一次使用此:(@fox在执行之前,你需要先修复包。请看我的回复。我正在使用sqlplus运行cmd中的代码。什么也没有发生。请检查编辑的帖子。编译时将显示错误。它不会显示任何错误。我不确定cmd(5,6,7,8)左侧的NUM在这种情况下意味着什么好。我甚至不确定它是否通过脚本。请详细说明为什么COMMIT;
会有帮助,以及它应该在代码中的什么位置插入。这并不提供问题的答案。要评论或要求作者澄清,请在他们的帖子下面留下评论。谢谢你,我会尝试,我会来的确认结果几分钟后,我尝试在sqldeveloper中运行它,这就是我得到的结果……”第2行:SQLPLUS命令跳过:set LINESIZE 400包体oprema_stanovanja编译警告:执行已完成并发出警告:00:00:00.010“@fox您是否收到带有“显示错误”的错误?请用固定的代码更新你的帖子。位置
表现在填充了吗?嘿,再次。我更新了我的代码。实际上第一部分很简单,因为关系是1…第二部分关系是N,很难解决。仍然会得到错误,但不会显示任何错误…顺便说一句…光标部分是必须的,因为这是老师的指示。你能检查代码的第二部分并帮助我修复它吗?非常感谢much@fox如果您看到我的示例答案,我已经演示了如何修复[2]另外。您需要使用end fill\u location;
来结束过程fill\u location
。您需要使用show errors
命令来实际查看错误。如果这在SQL developer中不起作用,请使用SQL*Plus。一旦显示错误,请阅读、理解并修改代码。