Oracle 填充表的PL/SQL块语句

Oracle 填充表的PL/SQL块语句,oracle,plsql,concatenation,sqlplus,Oracle,Plsql,Concatenation,Sqlplus,我对PL/SQL非常陌生,这一点让我感到困惑。在SQLPLUS中,我需要使用PL/SQL块来填充Description列,方法是从OLTP_车辆表中选择组合,然后将组合插入到新表中 VEHICLES表,最好通过循环中的光标执行。这就是我所拥有的: CREATE TABLE OLTP_Vehicles ( VIN VARCHAR(20) NOT NULL, trade_ID VARCHAR(10) NOT NULL, type VARCHAR(10), make VARCHAR(15), mode

我对PL/SQL非常陌生,这一点让我感到困惑。在SQLPLUS中,我需要使用PL/SQL块来填充Description列,方法是从OLTP_车辆表中选择组合,然后将组合插入到新表中 VEHICLES表,最好通过循环中的光标执行。这就是我所拥有的:

CREATE TABLE OLTP_Vehicles (
VIN VARCHAR(20) NOT NULL,
trade_ID VARCHAR(10) NOT NULL,
type VARCHAR(10),
make VARCHAR(15),
model VARCHAR(15),
where_from VARCHAR(30),
wholesale_cost NUMBER(8,2) NOT NULL,
PRIMARY KEY (VIN),
CONSTRAINT UC_Sale_Vehicles UNIQUE (VIN,trade_ID));

CREATE TABLE Vehicles (
vehicle_Code VARCHAR2(10),
description VARCHAR2(100),
PRIMARY KEY (vehicle_Code));

CREATE SEQUENCE veh_code_seq
MINVALUE 1
START WITH 1
INCREMENT BY 1
CACHE 20;

--PL/SQL Block
**SET SERVEROUTPUT ON
BEGIN
    FOR i in 1..10
    LOOP
        INSERT INTO Vehicles (vehicle_Code, description)
        VALUES veh_code_seq.NEXTVAL, (SELECT CONCAT(make, ', ',model) AS 
        description FROM OLTP_Vehicles); 
    END LOOP;
END;
/**
但我得到了这个错误:

值车辆代码,选择CONCATmake,,,型号作为OLTP车辆的说明; * 第5行错误: ORA-06550:第4行第50列: PL/SQL:ORA-00947:值不足 ORA-06550:第4行第1列: PL/SQL:SQL语句被忽略

我假设这是导致问题的SELECT CONCAT语句。如何从另一个表中拉入两列,并将它们作为一列插入新表中

修正语句

结果:

SQL> SELECT * FROM Vehicles ORDER BY vehicle_Code DESC;

VEHICLE_CODE    DESCRIPTION
--------------- ------------------------------
9               Chevrolet, Camaro
8               Chevrolet, Colorado
7               Dodge, Challenger
6               Ford, Fusion
50              Ford, Taurus
5               Chevrolet, Silverado
49              Chevrolet, Tahoe
48              Chevrolet, Colorado
47              Chevrolet, Colorado
46              Chevrolet, Silverado
45              Dodge, Ram

VEHICLE_CODE    DESCRIPTION
--------------- ------------------------------
44              Chevrolet, Impala
43              Chevrolet, Silverado
42              Chevrolet, Silverado
41              Chevrolet, Silverado
40              Chevrolet, Malibu
4               Ford, Focus
39              Dodge, Ram
38              Chevrolet, Camaro
37              Ford, F-350
36              Dodge, Ram
35              Ford, Fiesta

VEHICLE_CODE    DESCRIPTION
--------------- ------------------------------
34              Dodge, Dakota
33              Ford, F-150
32              Chevrolet, Silverado
31              Chevrolet, Suburban
30              Ford, Expedition
3               Dodge, Durango
29              Chevrolet, Colorado
28              Chevrolet, Tahoe
27              Dodge, Ram
26              Chevrolet, Silverado
25              Dodge, Charger

VEHICLE_CODE    DESCRIPTION
--------------- ------------------------------
24              Chevrolet, Silverado
23              Ford, F-150
22              Chevrolet, Tahoe
21              Chevrolet, Suburban
20              Ford, Expedition
2               Ford, Focus
19              Dodge, Charger
18              Chevrolet, Corvette
17              Chevrolet, Tahoe
16              Chevrolet, Suburban
15              Ford, F-250

VEHICLE_CODE    DESCRIPTION
--------------- ------------------------------
14              Ford, Edge
13              Chevrolet, Colorado
12              Chevrolet, Corvette
11              Dodge, Charger
10              Chevrolet, Camaro
1               Ford, Fusion

50 rows selected.

SQL>
现在,我需要弄清楚如何获得不同的品牌和型号,因为它们没有与VIN连接,我需要弄清楚为什么车辆代码不是从1和DESC顺序开始的。

请尝试下面的代码块

Declare
cursor c_vin is select distinct vin /*unique id*/ from OLTP_Vehicles;

begin

for c1 in c_vin loop

INSERT INTO Vehicles
(vehicle_Code, description)
SELECT veh_code_seq.NEXTVAL, make ||', '|| model
FROM OLTP_Vehicles where vin=c1.vin;


End loop;
commit;

End;

concat函数只接受两个参数,而不是三个。只需替换为字符串串联运算符| |示例:

BEGIN
    FOR i in 1..10
    LOOP
        INSERT INTO Vehicles (vehicle_Code, description)
        VALUES (veh_code_seq.NEXTVAL, (SELECT make||', '||model AS 
        description FROM OLTP_Vehicles) ); 
    END LOOP;
END;
然而,这并不是你问题的结束。嵌入的SELECT语句没有意义。它正在读取每个环路上OLTP_车辆的所有行
迭代。这是您的意图吗?

我认为您需要做的就是使用下面的查询将数据插入Vehicles表(如果这是一次性工作)

insert into Vehicles 
select  rownum,  description from ( select  distinct initcap(trim(make)) ||', '||initcap(trim(model)) description from OLTP_Vehicles) ;

我应该从OLTP_Vehicles表中找到品牌和型号的所有组合,并将其插入Vehicles表中。这并不一定是OLTP_Vehicles表中的行数,尽管品牌和型号是随机分配的。我明白你的观点,我是如何阅读所有的行,而不仅仅是不同的行。我需要弄清楚这一点…出于某种原因,车辆代码没有开始并以1递增,品牌和型号也不明显。我意识到我忘了把这个放在我的第一个问题里。我用我的结果修改了我的问题。实际上,每当你选择veh_code_seq.NEXTVAL时,无论你是否将其插入表中,它都会将序列增加1。因此,无论何时使用select查询,序列都将递增。
insert into Vehicles 
select  rownum,  description from ( select  distinct initcap(trim(make)) ||', '||initcap(trim(model)) description from OLTP_Vehicles) ;