BEGIN for i in 10..30 LOOP insert into demo(id) values(i); end loop; commit; end; 有错误吗
时间: 2024-10-14 12:14:16 浏览: 14
这段SQL脚本看起来是用来插入数据到名为demo的表中的,循环从10到30,每次循环将当前数值i插入id列。整个过程包括了`FOR LOOP`结构的初始化、循环体(`LOOP`至`END LOOP`)以及提交事务(`COMMIT`)。然而,在标准的SQL语法中,`BEGIN`和`END`通常用于启动和结束存储过程或触发器,而不是在循环语句中。
在Oracle或PL/SQL中,这可能会是一个存储过程的一部分,但在标准的SQL(如MySQL,PostgreSQL等)中,它应该放在`BEGIN TRANSACTION`和`COMMIT`之间,因为`COMMIT`会自动结束当前事务,而不会包裹在一个循环里。
所以,如果你是在一个支持PL/SQL的环境中,比如Oracle,这段代码可能没问题,因为它会被视为一个匿名块。但如果是在纯SQL中,`BEGIN`和`END`应该是不必要的,而且在循环外部提交事务才合适。
正确的做法是:
```sql
BEGIN TRANSACTION;
FOR i IN 10..30 LOOP
INSERT INTO demo (id) VALUES (i);
END LOOP;
COMMIT;
```
相关问题
BEGIN TRANSACTION; FOR i IN 10..30 LOOP INSERT INTO demo (id) VALUES (i); END LOOP; COMMIT; 在PG中对吗
在PostgreSQL中,`BEGIN TRANSACTION;`,`FOR i IN 10..30 LOOP`, `INSERT INTO demo (id) VALUES (i);`, 和 `COMMIT;` 这些语句是一段典型的用于批量插入数据的T-SQL(Transact-SQL)示例,但这实际上是Oracle SQL的一种语法。在PostgreSQL中,虽然它们的逻辑类似,但语法上会有差异:
- `BEGIN TRANSACTION;` 对应于 `BEGIN;`,这是开始一个新的事务。
- `FOR i IN 10..30 LOOP` 在PostgreSQL里会变成一个循环,例如 `FOR i IN 10..30 DO ... LOOP END DO;`,因为PostgreSQL更倾向于使用`DO`关键字而不是`.`。
- `INSERT INTO demo (id) VALUES (i);` 这个SQL语句是正确的,用于向名为 "demo" 的表插入一行,其中 id 等于当前的循环变量 `i`。
- `COMMIT;` 保持不变,表示提交当前事务。
所以,如果要在PostgreSQL中实现类似的功能,你会看到这样的形式:
```sql
BEGIN;
FOR i IN 10..30 LOOP
INSERT INTO demo (id) VALUES (i);
END LOOP;
COMMIT;
```
记得在PostgreSQL中,每个 `DO` 循环内部都应该是可重复执行的独立命令块,而不仅仅是单条 `INSERT` 语句。
CREATE OR REPLACE PROCEDURE p1(records_number IN NUMBER) IS BEGIN FOR i IN 1..records_number LOOP INSERT INTO CI_CIPH_HIGH_PTY_ADDR_RELA (ECIF_CUST_NO, PTY_ADDR_RELA_TYP, ADDR_ID) VALUES ( 'CUST_NO_' || LPAD(i, 10, '0'), CASE MOD(i,3) WHEN 0 THEN 'HOME' WHEN 1 THEN 'OFFICE' ELSE 'OTHER' END, 'ADDRESS_' || LPAD(i, 10, '0') ); END LOOP; COMMIT; END; 帮我修改代码
根据您的要求,我对代码进行了修改,如下所示:
```
CREATE OR REPLACE PROCEDURE p1(records_number IN NUMBER) IS
BEGIN
FOR i IN 1..records_number LOOP
INSERT INTO CI_CIPH_HIGH_PTY_ADDR_RELA (ECIF_CUST_NO, PTY_ADDR_RELA_TYP, ADDR_ID)
VALUES (
'CUST_NO_' || LPAD(i, 10, '0'),
CASE MOD(i,3)
WHEN 0 THEN 'HOME'
WHEN 1 THEN 'OFFICE'
ELSE 'OTHER'
END,
'ADDRESS_' || LPAD(i, 10, '0')
);
IF MOD(i, 1000) = 0 THEN
COMMIT;
END IF;
END LOOP;
COMMIT;
END;
```
我在原代码的基础上,添加了一个判断语句,每插入1000条数据就进行一次COMMIT操作,以提高代码的执行效率。
阅读全文