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