Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何使用过程填充数据库_Sql_Database_Oracle_Entity Relationship_Create Table - Fatal编程技术网

Sql 如何使用过程填充数据库

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_

我有大约15个不同的表,其中填充了不同的数据和不同的实体关系

我需要创建一个脚本,用这些表的内容填充我的数据库

脚本完成后,我在cmd中运行它,使用sqlplus和稍后的文件启动路径

我有两个不同的sql文件,一个名为db_spec.sql,另一个名为db_body.sql

在我的db_body.sql中,我创建了一个过程来存储具有1:N关系的两个表中的数据

第一个表格

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
  • PL/SQL变量名需要与实际列名不同,以避免INSERT语句中出现歧义。[您不能让
    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。一旦显示错误,请阅读、理解并修改代码。