PLSQL三种循环语句
plsql存储过程循环写法
plsql存储过程循环写法
在PL/SQL中,可以使用循环语句来编写存储过程。
以下是两种常见的循环写法。
1. 使用FOR循环:
```
CREATE OR REPLACE PROCEDURE my_procedure IS BEGIN
FOR i IN 1..10 LOOP
-- 执行循环体中的操作
...
END LOOP;
END;
/
```
在上述示例中,FOR循环从1到10进行迭代,循环变量i在每次迭代中自动递增1。
2. 使用WHILE循环:
```
CREATE OR REPLACE PROCEDURE my_procedure IS
i NUMBER := 1; -- 初始化循环变量
BEGIN
WHILE i <= 10 LOOP
-- 执行循环体中的操作
...
i := i + 1; -- 更新循环变量
END LOOP;
END;
/
```
在上述示例中,WHILE循环在i小于等于10的条件下进行迭代,循环变量i在每次迭代中手动自增1。
无论是使用FOR循环还是WHILE循环,循环体中的操作可以根据具体需求进行编写,可以执行数据库操作、控制流程、调用其他存储过程等。
PLSQL基本语法
PLSQL基本语法作者:gqk:1,什么是plsql: 是专⽤于Oracle服务器,在SQL基础之上,添加了⼀些过程化控制语句,叫PLSQL过程化包括有:类型定义,判断,循环,游标,异常或例外处理。
PLSQL强调过程2,Plsql语句块: PL/SQL程序都是以块(block)为基本单位,整个PL/SQL块分三部分:声明部分(⽤declare开头)执⾏部分(以 begin开头)其中执⾏部分是必须的,其他两个部分可选部分(以exception开头)结束:end--基本输出语句:BEGINdbms_output.put_line('hello,world');END;--基本输出语句BEGINdbms_output.put_line('hello,world');dbms_output.put_line(157);dbms_output.put_line(sysdate);dbms_output.put_line(true);--不能传⼊布尔值END;3,Plsql语句块分类: 匿名块:动态构造只执⾏⼀次(main)⼦程序:存储在数据库中的存储过程,函数及包等。
当在数据库建⽴好后可以在其他⼦程序中调⽤触发器:当数据库发⽣操作时,会触发⼀些事件,从⽽⾃动执⾏相应的程序4,Plsql中的变量类型:5,变量的使⽤: plsql中声明和执⾏部分要严格分开,在java中时先声明后写变量plsql中相反先声明在写数据类型: 变量在声明后没有赋值输出结果为空: 变量的声明和初始化:(boolean中只能声明不能输出)DECLAREi NUMBER(4) := 157;j NUMBER(6);c VARCHAR2(200) := 'HELLO,WORLD';d DATE := sysdate;b BOOLEAN := TRUE;BEGINj := 1000;--只能写在执⾏部分dbms_output.put_line('i=' || i);dbms_output.put_line('j=' || j);dbms_output.put_line('c=' || c);dbms_output.put_line('d=' || d);END;在声明快中对常量的声明: 变量名称【constant】 type 【not null】【:value】DECLAREc CONSTANT NUMBER(4) := 100;c2 NUMBER(4) NOT NULL := 101;BEGIN--c := 101; --常量不能重复赋值dbms_output.put_line('c=' || c);dbms_output.put_line('c2=' || c2);END; --空语句 NULL 执⾏语句中必须写东西DECLAREc CONSTANT NUMBER(4) := 100;c2 NUMBER(4) NOT NULL := 101;BEGINNULL;--空语句,作为占位符使⽤END; 6,PLSQL中使⽤sql: --更新100员⼯,⼯资增加1块钱 :(不能再执⾏块中直接输出select语句)声明变量:员⼯的编号声明变量:⼯资追加的钱数DECLAREv_empid BINARY_INTEGER := 100;v_money BINARY_INTEGER := 1;BEGINUPDATE employees SET salary=salary+v_moneyWHERE employee_id=v_empid;COMMIT;END;PLSQL中使⽤SQL语句的⼏种情况:DML或DCL语句:直接执⾏ 查询语句:SELECT...INTO 或者游标DDL语句:动态SQL执⾏ 7,SELECT...INTO...的使⽤:语法:SELECT 列1,列2,…… INTO 变量1,变量2,……--查询某个员⼯编号的姓名和⼯资:员⼯编号姓名⼯资 列和变量的顺序,个数必须保持⼀致(如果没有数据则会抛出异常,返回的结果超过⼀⾏也会有异常)DECLAREv_empid BINARY_INTEGER := 101;v_name VARCHAR2(50);v_salary NUMBER(8,2);BEGINSELECT last_name,salaryINTO v_name,v_salaryFROM employeesWHERE employee_id=v_empid;dbms_output.put_line(v_empid || ',' || v_name || ',' || v_salary);END;--查询某个员⼯编号的姓名,⼯资,⼊职⽇期,部门编号:(以上思路我们需要声明多个变量) DECLAREv_empid BINARY_INTEGER := 101;v_name VARCHAR2(50);v_salary NUMBER(8,2);v_hiredate DATE;v_deptid BINARY_INTEGER;BEGINSELECT last_name,salary,hire_date,department_idINTO v_name,v_salary,v_hiredate,v_deptidFROM employeesWHERE employee_id=v_empid;dbms_output.put_line(v_empid || ',' || v_name || ','|| v_salary || ',' || v_hiredate || ',' || v_deptid);END;java中处理多个数据我们可以封装为对象:plsql中可以声明记录类型:时把逻辑相关的数据作为⼀个单元存储起来:--记录类型record--查询某个员⼯编号的姓名,⼯资,⼊职⽇期,部门编号DECLARETYPE emp_record_type IS RECORD (empid BINARY_INTEGER := 102,ename VARCHAR2(50),salary NUMBER(8,2),hiredate DATE,deptid BINARY_INTEGER);e emp_record_type;BEGINSELECT employee_id,last_name,salary,hire_date,department_idINTO eFROM employeesWHERE employee_id=e.empid;dbms_output.put_line(e.empid);dbms_output.put_line(e.ename);dbms_output.put_line(e.salary);dbms_output.put_line(e.hiredate);dbms_output.put_line(e.deptid);END; --参照引⽤类型:参照已有的数据类型--参照引⽤类型--参照引⽤变量类型:变量名称%TYPE--参照引⽤表中的列类型:表名.列名%TYPE--参照引⽤表的记录类型:表名%ROWTYPE demo:DECLAREi NUMBER(4);j i%TYPE := 100;--参照i的类型k employees.employee_id%TYPE := 101;--参照员⼯表中员⼯编号的数据类型BEGINdbms_output.put_line('j=' || j);dbms_output.put_line('k=' || k);END;--查询某个员⼯编号的姓名,⼯资,⼊职⽇期,部门编号(参照类型)DECLARETYPE emp_record_type IS RECORD (empid employees.employee_id%TYPE := 102,ename st_name%TYPE,salary employees.salary%TYPE,hiredate employees.hire_date%TYPE,deptid employees.department_id%TYPE);e emp_record_type;BEGINSELECT employee_id,last_name,salary,hire_date,department_idINTO eFROM employeesWHERE employee_id=e.empid;dbms_output.put_line(e.empid);dbms_output.put_line(e.ename);dbms_output.put_line(e.salary);dbms_output.put_line(e.hiredate);dbms_output.put_line(e.deptid);END; --查询某个员⼯编号的姓名,⼯资,⼊职⽇期,部门编号(参照引⽤表的记录类型)DECLAREe employees%ROWTYPE;BEGINe.employee_id := 103;SELECT *INTO eFROM employeesWHERE employee_id=e.employee_id;dbms_output.put_line(e.employee_id);dbms_output.put_line(st_name);dbms_output.put_line(e.salary);dbms_output.put_line(to_char(e.hire_date,'yyyy-mm-dd'));dbms_output.put_line(e.department_id);END;--PLSQL表类型 /*TYPE ⾃定义类型名称 IS TABLE OF 元素类型INDEX BY BINARY_INTEGER;*/DECLARETYPE name_table_type IS TABLE OF VARCHAR2(50)INDEX BY BINARY_INTEGER;n name_table_type;BEGINn(-7) := 'tom';n(4) := 'jack';n(9) := 'rose';dbms_output.put_line('元素的长度:' || n.count);dbms_output.put_line(n(4));END; --表类型的常⽤属性DECLARETYPE name_table_type IS TABLE OF VARCHAR2(50)INDEX BY BINARY_INTEGER;n name_table_type;BEGIN--设置元素n(-5) := 'tom';n(3) := 'jack';n(17) := 'rose';n(23) := 'zhang';n(24) := 'wangwu';--删除指定下标的元素--n.delete(17);--删除⼀个范围的元素--n.delete(10,24);--删除所有元素--n.delete;--返回元素长度dbms_output.put_line('元素个数:' || n.count);--判断下标是否存在IF n.exists(17) THENdbms_output.put_line('true');ELSEdbms_output.put_line('false');END IF;--输出最⼩下标dbms_output.put_line(n.first);--输出最⼤下标dbms_output.put_line(st);--返回指定下标的元素dbms_output.put_line(n(3));--返回上⼀个或下⼀个存在的下标,如果没有,返回NULLdbms_output.put_line(n.next(10));dbms_output.put_line(n.prior(10));END;--BULK COLLECT INTO:把查询结果⼀次性赋给⼀个表类型的变量,下标⾃动从1开始递增 --查询所有的员⼯姓名,存储到⼀个表类型的变量中DECLARETYPE name_table_type IS TABLE OF VARCHAR2(50)INDEX BY BINARY_INTEGER;n name_table_type;BEGINSELECT last_name BULK COLLECT INTO nFROM employees;dbms_output.put_line('元素长度:' || n.count);dbms_output.put_line(n(2));END;--查询所有的员⼯信息,存储到⼀个表类型的变量中DECLARETYPE emp_table_type IS TABLE OF employees%ROWTYPEINDEX BY BINARY_INTEGER;e emp_table_type;BEGINSELECT * BULK COLLECT INTO eFROM employees;dbms_output.put_line('元素长度:' || e.count);dbms_output.put_line(e(2).last_name);dbms_output.put_line(e(3).salary);END; 8,DML语句返回值:--RETURNING语句:DML操作返回值赋给变量RETURN 列1,列2,... INTO 变量1,变量2,...--更新某个员⼯的⼯资,输出这个员⼯姓名,新⼯资DECLAREv_empid employees.employee_id%TYPE := 100;v_name st_name%TYPE;v_money employees.salary%TYPE := 1;v_salary employees.salary%TYPE;BEGINUPDATE employeesSET salary=salary+v_moneyWHERE employee_id=v_empidRETURNING last_name,salaryINTO v_name,v_salary;dbms_output.put_line('姓名:' || v_name);dbms_output.put_line('新⼯资:' || v_salary);END; --插⼊语句中使⽤RETURNING语句:DECLAREd dept%ROWTYPE;BEGININSERT INTO dept VALUES (50,'AA','BB')RETURN deptno,dname,loc INTO d;dbms_output.put_line(d.deptno);dbms_output.put_line(d.dname);dbms_output.put_line(d.loc);END; --删除语句中使⽤RETURNING语句DECLAREd dept%ROWTYPE;BEGINDELETE FROM deptWHERE deptno=50RETURN deptno,dname,loc INTO d;dbms_output.put_line(d.deptno);dbms_output.put_line(d.dname);dbms_output.put_line(d.loc);END; --DML操作返回多⾏数据--更新某个部门的员⼯的⼯资,返回被更新的员⼯姓名,新⼯资DECLARETYPE emp_record_type IS RECORD (ename st_name%TYPE,salary employees.salary%TYPE);TYPE emp_table_type IS TABLE OF emp_record_typeINDEX BY BINARY_INTEGER;e emp_table_type;BEGINUPDATE employeesSET salary=salary+1WHERE department_id=50RETURN last_name,salary BULK COLLECT INTO e; dbms_output.put_line('更新了' || e.count || '个员⼯'); dbms_output.put_line(e(1).ename || ',' || e(1).salary); END;。
sql 循环语句用法
在SQL 中,循环语句通常用于执行需要重复执行的任务。
然而,请注意,SQL 本身并不直接支持循环语句,因为它是一种集合型语言,旨在处理一组数据记录,而不是单个记录。
尽管如此,大多数SQL 数据库管理系统(DBMS)提供了存储过程或函数等编程构造,允许你使用条件语句和循环逻辑。
以下是几个常见的示例:1. MySQL 和MariaDB 使用WHILE 循环:```sqlDELIMITER //CREATE PROCEDURE while_loop_example()BEGINDECLARE counter INT DEFAULT 1;WHILE counter \u003c= 10 DO-- 在此处执行你的逻辑SELECT counter;SET counter = counter + 1;END WHILE;END //DELIMITER ;```2. Oracle 使用PL/SQL,它支持WHILE、FOR 和LOOP 循环:```sqlCREATE OR REPLACE PROCEDURE loop_example IScounter NUMBER := 1;BEGINLOOP-- 在此处执行你的逻辑DBMS_OUTPUT.PUT_LINE(counter);counter := counter + 1;EXIT WHEN counter \u003e 10; -- 退出循环的条件END LOOP;END;```3. SQL Server 使用T-SQL,支持WHILE 和FOR 循环:```sqlCREATE PROCEDURE while_loop_example ASBEGINDECLARE @counter INT = 1;WHILE @counter \u003c= 10BEGIN-- 在此处执行你的逻辑PRINT @counter;SET @counter = @counter + 1;END;END;```4. PostgreSQL 使用PL/pgSQL,它支持WHILE、FOR 和LOOP 循环:```sqlDO $$DECLARE counter INTEGER := 1;BEGINLOOP-- 在此处执行你的逻辑RAISE NOTICE '%', counter;counter := counter + 1;EXIT WHEN counter \u003e 10; -- 退出循环的条件END LOOP;END $$;```请注意,具体的语法和示例可能因使用的数据库管理系统而有所不同。
Oracle中PLSQL的循环语句
Oracle中PLSQL的循环语句在PL/SQL中可以使⽤LOOP语句对数据进⾏循环处理,利⽤该语句可以循环执⾏指定的语句序列。
常⽤的LOOP循环语句包含3种形式:基本的LOOP、WHILE...LOOP和FOR...LOOP。
LOOP语句的基本语法结构如下:[<<label_name>>]LOOPstatement...END LOOP [label_name]【语法说明】<<label_name>>:LOOP结构的标签,是可选项。
LOOP:LOOP循环开始标志。
statement:LOOP语句中循环执⾏的语句序列。
END LOOP:LOOP循环结束标志,可以添加LOOP结构的标签。
1.基本的LOOP语句实例:要求声明变量,每次循环都需要为变量增加数字1,并输出结果。
当变量值⼤于3时,退出循环操作。
a、利⽤EXIT...WHEN结束循环操作。
SQL> set serveroutput on;SQL> --exit whenSQL> declare2 v_rlt number(8):=-3;3 begin4 <<fst_loop>>5 loop6 dbms_output.put_line('v_rlt = '||v_rlt);7 v_rlt:=v_rlt+1;8 exit fst_loop when v_rlt > 3;9 end loop;10 dbms_output.put_line('LOOP循环已经结束!');11 end;12 /v_rlt = -3v_rlt = -2v_rlt = -1v_rlt = 0v_rlt = 1v_rlt = 2v_rlt = 3LOOP循环已经结束!PL/SQL procedure successfully completedb、利⽤IF...EXIT语句结束循环SQL> --if exitSQL> declare2 v_rlt number(8):=-3;3 begin4 <<fst_loop>>5 loop6 dbms_output.put_line('v_rlt = '||v_rlt);7 v_rlt:=v_rlt+1;8 if v_rlt > 3 then9 dbms_output.put_line('变量的值已经⼤于3,当前值为'||v_rlt);10 exit fst_loop;11 end if;12 end loop fst_loop;13 dbms_output.put_line('LOOP循环已经结束!');14 end;15 /v_rlt = -3v_rlt = -2v_rlt = -1v_rlt = 0v_rlt = 1v_rlt = 2v_rlt = 3变量的值已经⼤于3,当前值为4LOOP循环已经结束!PL/SQL procedure successfully completed2、WHILE...LOOP结构WHILE...LOOP结构和基本的LOOP语句不同,它本⾝可以结束LOOP循环。
PLSQL语法
PLSQL语法Procedural Language和SQL的结合体。
通过增加变量、控制语句,使我们可以写些逻辑更加复杂的数据库操作语句框架组成declare – 可选声明各种变量或游标的地⽅。
begin – 必要开始执⾏语句。
--单⾏注释语句⽤两个连在⼀起的‘-’表⽰。
/*多⾏注释语句,可以换⾏*/exception – 可选出错后的处理。
end; – 必要(请注意end后⾯的分号)简单helloworld程序1declare2 v_temp number(6):=123; /* := 是⼀个赋值符号 */3begin4 dbms_output.put_line('middle');5 dbms_output.put_line(v_temp);6end;注意要想显⽰程序的东西需要设置环境set serveroutput off -->关闭输出(默认关闭)set serveroutput on -->打开输出基本数据类型Number 数字型Int 整数型Pls_integer 整数型,产⽣溢出时出现错误Binary_integer 整数型,表⽰带符号的整数Char 定长字符型,最⼤255个字符Varchar2 变长字符型,最⼤2000个字符Long 变长字符型,最长2GBDate ⽇期型Boolean 布尔型(TRUE、FALSE、NULL三者取⼀)%type 表⽰不需要知道具体的⼀个字段类型,与指定的字段类型⼀致即可。
例如:v_empno emp.empno%type;%rowtype 与表结构完全⼀致 %rowtype 举例:1declare2 v_tt emp%rowtype;3begin4select*into v_tt from emp where empno=7521;5 dbms_output.put_line(v_tt.job);6 dbms_output.put_line(v_tt.sal);7end;89输出:SALESMAN101250varray定义语法TYPE VARRAY NAMEIS VARRAY(SIZE) OF ELEMENT TYPE [NOT NULL];其中,varray name是VARRAY数据类型的名称,size是正整数,表⽰可以容纳的成员的最⼤数量,每个成员的数据类型是element typeo默认时,成员可以取空值,否则需要使⽤NOT NULL加以限制。
plsql loop用法-概述说明以及解释
plsql loop用法-概述说明以及解释1.引言1.1 概述PL/SQL循环是编程语言PL/SQL中非常重要的一个概念。
在编写程序时,经常会遇到需要重复执行某些代码块的情况,这时就需要使用循环语句来实现。
PL/SQL循环提供了多种类型的循环结构,可以根据具体的需求选择合适的循环方式。
循环结构可以帮助程序实现重复执行的需求,提高了代码的可复用性和效率。
通过循环,可以反复执行一段代码,直到满足某个条件退出循环或达到循环执行的次数上限。
PL/SQL循环的语法和用法非常灵活,可以根据不同的需求选择不同的循环方式,如FOR循环、WHILE循环和LOOP循环等。
每种循环方式都有其特殊的应用场景,可以根据具体的编程需求选择最适合的循环结构。
本文将详细介绍PL/SQL循环的基本概念、语法和用法,并举例说明不同类型循环的具体应用场景。
我们将深入探讨循环结构在程序中的重要性,以及如何灵活运用循环语句来解决实际编程中的问题。
在进一步研究和学习PL/SQL循环的过程中,我们建议读者通过阅读相关文献和教程,参与实际的编程实践,以加深对循环结构的理解和掌握。
只有深入学习并不断实践,才能在编程中熟练运用循环语句,提高代码的可维护性和可扩展性。
总之,PL/SQL循环是编程中不可或缺的一部分,理解和掌握循环结构的基本概念和用法对于开发高效、可靠的程序至关重要。
在接下来的正文部分,我们将详细介绍PL/SQL循环的相关内容,帮助读者深入了解和运用循环语句。
1.2 文章结构本文将介绍PL/SQL循环的用法,包括循环的基本概念、语法和用法。
文章分为三个主要部分:引言、正文和结论。
在引言部分,我们将概述本文的主题和目的。
PL/SQL循环作为PL/SQL语言中的重要概念之一,对于程序的控制流非常关键。
通过深入探讨PL/SQL循环的用法,我们可以提高代码的效率,增强程序的可读性和可维护性。
在正文部分,将首先介绍PL/SQL循环的基本概念。
我们将解释什么是循环以及循环的作用和优势。
sql语句循环查询详解
sql语句循环查询详解
SQL语句循环查询指的是在查询数据时,需要进行多次迭代,以获取所有需要的结果。
这种查询方式通常用于数据量较大或需要跨表查询的情况下。
SQL语句循环查询可以通过多种方式实现,其中最常见的方式是使用循环语句,如WHILE或FOR循环。
在循环过程中,可以通过变量或游标来控制循环的次数和查询的条件,以达到所需的结果。
SQL语句循环查询还可以使用递归查询方式,通过自身调用来进行多次迭代查询。
递归查询通常用于树形结构数据或层级结构数据的查询。
需要注意的是,SQL语句循环查询可能会影响查询效率,尤其是在数据量较大的情况下。
因此,在使用此类查询方式时,需要评估查询效率和性能,以确保查询结果的准确性和查询速度的可接受性。
总之,SQL语句循环查询是一种常用的查询方式,适用于数据量较大或需要跨表查询的情况下。
在使用此类查询方式时,需要评估查询效率和性能,以确保查询结果的准确性和查询速度的可接受性。
- 1 -。
plsql使用技巧
plsql使用技巧PL/SQL是Oracle数据库的一种编程语言,可以用于编写存储过程、触发器、函数等程序。
本文将从以下几个方面介绍PL/SQL的使用技巧:一、变量和常量的使用1.1 变量的定义在PL/SQL中,可以使用DECLARE语句来定义变量。
例如:DECLAREv_name VARCHAR2(100);BEGINv_name := 'John';END;1.2 常量的定义在PL/SQL中,可以使用CONSTANT关键字来定义常量。
例如:DECLAREc_pi CONSTANT NUMBER := 3.1415926;BEGINNULL;END;1.3 变量和常量的命名规则在PL/SQL中,变量和常量的命名规则与其他编程语言类似。
变量和常量的名称必须以字母开头,并且只能包含字母、数字和下划线。
二、条件语句的使用2.1 IF语句IF语句用于根据条件执行不同的代码块。
例如:DECLAREv_age NUMBER := 18;BEGINIF v_age >= 18 THENDBMS_OUTPUT.PUT_LINE('You are an adult.');ELSEDBMS_OUTPUT.PUT_LINE('You are a minor.');END IF;END;2.2 CASE语句CASE语句用于根据不同情况执行不同代码块。
例如:DECLAREv_day_of_week NUMBER := 5;BEGINCASE v_day_of_weekWHEN 1 THEN DBMS_OUTPUT.PUT_LINE('Monday');WHEN 2 THEN DBMS_OUTPUT.PUT_LINE('Tuesday');WHEN 3 THEN DBMS_OUTPUT.PUT_LINE('Wednesday'); WHEN 4 THEN DBMS_OUTPUT.PUT_LINE('Thursday'); WHEN 5 THEN DBMS_OUTPUT.PUT_LINE('Friday');ELSE DBMS_OUTPUT.PUT_LINE('Weekend');END CASE;END;三、循环语句的使用3.1 FOR循环FOR循环用于执行一组代码块一定次数。
PLSQL常用语句汇总
PLSQL常用语句汇总以下是一些常用的PL/SQL语句汇总:1.声明变量:DECLARE变量名数据类型;BEGIN--执行代码END;2.定义常量:DECLARE常量名CONSTANT数据类型:=值;BEGIN--执行代码END;3.条件语句:IF条件THEN--执行代码ELSIF条件THEN--执行代码ELSE--执行代码ENDIF;4.循环语句:FOR变量名IN范围LOOP--执行代码ENDLOOP;WHILE条件LOOP--执行代码ENDLOOP;5.游标:DECLARECURSOR cursor_name IS SELECT 列名 FROM 表名;变量数据类型;BEGINOPEN cursor_name;LOOPFETCH cursor_name INTO 变量;EXIT WHEN cursor_name%NOTFOUND;--执行代码ENDLOOP;CLOSE cursor_name;END;6.异常处理:BEGIN--执行代码EXCEPTIONWHEN exception_name THEN--异常处理代码END;7.存储过程:CREATE OR REPLACE PROCEDURE procedure_name IS --输入参数声明--输出参数声明BEGIN--执行代码END;8.存储函数:CREATE OR REPLACE FUNCTION function_name RETURN 数据类型 IS --输入参数声明--输出参数声明BEGIN--执行代码RETURN返回值;END;这些是常用的PL/SQL语句,你可以根据具体需求进行使用。
PLSQL函数
plsql常用方法在SQLPLUS下,实现中-英字符集转换alter session set nls_language='AMERICAN';alter session set nls_language='SIMPLIFIED CHINESE';主要知识点:一、有关表的操作1)建表create table test as select * from dept; --从已知表复制数据和结构create table test as select * from dept where 1=2; --从已知表复制结构但不包括数据2)插入数据:insert into test select * from dept;二、运算符算术运算符:+ - * / 可以在select 语句中使用连接运算符:|| select deptno|| dname from dept;比较运算符:> >= = != < <= like between is null in逻辑运算符:not and or集合运算符:intersect ,union,union all,minus要求:对应集合的列数和数据类型相同查询中不能包含long 列列的标签是第一个集合的标签使用order by时,必须使用位置序号,不能使用列名例:集合运算符的使用:intersect ,union,union all,minusselect * from emp intersect select * from emp where deptno=10 ;select * from emp minus select * from emp where deptno=10;select * from emp where deptno=10 union select * from emp where deptno in (10,20); --不包括重复行select * from emp where deptno=10 union all select * from emp where deptno in (10,20); --包括重复行三,常用ORACLE 函数sysdate为系统日期dual为虚表一)日期函数[重点掌握前四个日期函数]1,add_months[返回日期加(减)指定月份后(前)的日期]select sysdate S1,add_months(sysdate,10) S2,add_months(sysdate,5) S3 from dual;2,last_day [返回该月最后一天的日期]select last_day(sysdate) from dual;3,months_between[返回日期之间的月份数]select sysdate S1, months_between('1-4月-04',sysdate) S2,months_between('1-4月-04','1-2月-04') S3 from dual4,next_day(d,day): 返回下个星期的日期,day为1-7或星期日-星期六,1表示星期日select sysdate S1,next_day(sysdate,1) S2,next_day(sysdate,'星期日') S3 FROM DUAL5,round[舍入到最接近的日期](day:舍入到最接近的星期日)select sysdate S1,round(sysdate) S2 ,round(sysdate,'year') YEAR,round(sysdate,'month') MONTH ,round(sysdate,'day') DAY from dual6,trunc[截断到最接近的日期]select sysdate S1,trunc(sysdate) S2,trunc(sysdate,'year') YEAR,trunc(sysdate,'month') MONTH ,trunc(sysdate,'day') DAY from dual7,返回日期列表中最晚日期select greatest('01-1月-04','04-1月-04','10-2月-04') from dual二)字符函数(可用于字面字符或数据库列)1,字符串截取select substr('abcdef',1,3) from dual2,查找子串位置select instr('abcfdgfdhd','fd') from dual3,字符串连接select 'HELLO'||'hello world' from dual;4, 1)去掉字符串中的空格select ltrim(' abc') s1,rtrim('zhang ') s2,trim(' zhang ') s3 from dual2)去掉前导和后缀select trim(leading 9 from 9998767999) s1,trim(trailing 9 from 9998767999) s2,trim(9 from 9998767999) s3 from dual;5,返回字符串首字母的Ascii值select ascii('a') from dual6,返回ascii值对应的字母select chr(97) from dual7,计算字符串长度select length('abcdef') from dual8,initcap(首字母变大写),lower(变小写),upper(变大写)select lower('ABC') s1,upper('def') s2,initcap('efg') s3 from dual;9,Replaceselect replace('abc','b','xy') from dual;10,translateselect translate('abc','b','xx') from dual; -- x是1位11,lpad [左添充] rpad [右填充](用于控制输出格式)select lpad('func',15,'=') s1, rpad('func',15,'-') s2 from dual;select lpad(dname,14,'=') from dept;12, decode[实现if ..then 逻辑]select deptno,decode(deptno,10,'1',20,'2',30,'3','其他') from dept;三)数字函数1,取整函数(ceil 向上取整,floor 向下取整)select ceil(66.6) N1,floor(66.6) N2 from dual;2, 取幂(power) 和求平方根(sqrt)select power(3,2) N1,sqrt(9) N2 from dual;3,求余select mod(9,5) from dual;4,返回固定小数位数(round:四舍五入,trunc:直接截断)select round(66.667,2) N1,trunc(66.667,2) N2 from dual;5,返回值的符号(正数返回为1,负数为-1)select sign(-32),sign(293) from dual;四)转换函数1,to_char()[将日期和数字类型转换成字符类型]1) select to_char(sysdate) s1,to_char(sysdate,'yyyy-mm-dd') s2,to_char(sysdate,'yyyy') s3,to_char(sysdate,'yyyy-mm-dd hh12:mi:ss') s4,to_char(sysdate, 'hh24:mi:ss') s5,to_char(sysdate,'DAY') s6 from dual;2) select sal,to_char(sal,'$99999') n1,to_char(sal,'$99,999') n2 from emp2, to_date()[将字符类型转换为日期类型]insert into emp(empno,hiredate) values(8000,to_date('2004-10-10','yyyy-mm-dd')); 3, to_number() 转换为数字类型select to_number(to_char(sysdate,'hh12')) from dual; //以数字显示的小时数五)其他函数user:返回登录的用户名称select user from dual;vsize:返回表达式所需的字节数select vsize('HELLO') from dual;nvl(ex1,ex2):ex1值为空则返回ex2,否则返回该值本身ex1(常用)例:如果雇员没有佣金,将显示0,否则显示佣金select comm,nvl(comm,0) from emp;nullif(ex1,ex2):值相等返空,否则返回第一个值例:如果工资和佣金相等,则显示空,否则显示工资select nullif(sal,comm),sal,comm from emp;coalesce:返回列表中第一个非空表达式select comm,sal,coalesce(comm,sal,sal*10) from emp;nvl2(ex1,ex2,ex3) :如果ex1不为空,显示ex2,否则显示ex3如:查看有佣金的雇员姓名以及他们的佣金select nvl2(comm,ename,') as HaveCommName,comm from emp;六)分组函数max min avg count sum1,整个结果集是一个组1) 求部门30 的最高工资,最低工资,平均工资,总人数,有工作的人数,工种数量及工资总和select max(ename),max(sal),min(ename),min(sal),avg(sal),count(*) ,count(job),count(distinct(job)) ,sum(sal) from emp where deptno=30;2, 带group by 和having 的分组1)按部门分组求最高工资,最低工资,总人数,有工作的人数,工种数量及工资总和select deptno, max(ename),max(sal),min(ename),min(sal),avg(sal),count(*) ,count(job),count(distinct(job)) ,sum(sal) from emp group by deptno;2)部门30的最高工资,最低工资,总人数,有工作的人数,工种数量及工资总和select deptno, max(ename),max(sal),min(ename),min(sal),avg(sal),count(*) ,count(job),count(distinct(job)) ,sum(sal) from emp group by deptno having deptno=30;3, stddev 返回一组值的标准偏差select deptno,stddev(sal) from emp group by deptno;variance 返回一组值的方差差select deptno,variance(sal) from emp group by deptno;4, 带有rollup和cube操作符的Group Byrollup 按分组的第一个列进行统计和最后的小计cube 按分组的所有列的进行统计和最后的小计select deptno,job ,sum(sal) from emp group by deptno,job;select deptno,job ,sum(sal) from emp group by rollup(deptno,job);cube 产生组内所有列的统计和最后的小计select deptno,job ,sum(sal) from emp group by cube(deptno,job);七、临时表只在会话期间或在事务处理期间存在的表.临时表在插入数据时,动态分配空间create global temporary table temp_dept(dno number,dname varchar2(10))on commit delete rows;insert into temp_dept values(10,'ABC');commit;select * from temp_dept; --无数据显示,数据自动清除on commit preserve rows:在会话期间表一直可以存在(保留数据)on commit delete rows:事务结束清除数据(在事务结束时自动删除表的数据)1.0摘要//简要说明该文档内容SQL是用来访问关系型数据库一种通用语言,其执行特点是非过程化,即不用指明执行的具体方法和途径,而是简单的调用相应语句来直接取得结果即可。
三种循环语句的使用
三种循环语句的使用
1. 嘿,你知道吗?for 循环就像一个勤劳的小蜜蜂,一直在花丛中忙碌着采蜜呢!比如说,我们可以用 for 循环来计算 1 到 10 的和,多方便呀!
2. 哇塞,while 循环可神奇啦!它就像一个等待时机的猎人,直到条件满足才行动。
就像我们玩游戏,一直等到分数达到某个值才停止,厉害吧!
3. 哎呀呀,do-while 循环可有意思了,它先执行一次再判断条件呢!好比你先勇敢地迈出一步,然后再看看接下来该怎么走,是不是很特别?比如先输出一个数,再判断是否继续。
4. 你想想,for 循环是不是像一列有序前进的小火车,一节一节地跑呀!像我们按顺序打印数组里的元素,就靠它啦!
5. 嘿,while 循环不就是那个执着的家伙嘛,不达目的不罢休!比如让用户一直输入直到输入正确为止,它就一直等着呢!
6. 哇哦,do-while 循环就像一个倔强的小孩,非要做了再说。
就像不管怎样先做一次操作,然后再考虑其他的,多有趣呀!
7. 你说 for 循环是不是像个精确的时钟,滴答滴答有规律地走呀!比如每隔一段时间执行一个任务,它就能搞定!
8. 哎呀,while 循环简直就是个耐心的守候者,静静地等待那个时刻的到来。
像程序中等待某个状态改变,它就一直守着。
9. 嘿,do-while 循环像不像一个先行动派,先干了再说后面的!比如先输出个提示,然后再判断用户输入对不对。
10. 你看,for 循环多像一个有计划的旅行者,一步一步按照设定的路线走!像我们要遍历一个列表,它就是最好的伙伴呀!。
PLSQL基础语法
PLSQL基础语法有时候我们需要对数据库中的数据进⾏⼀些稍微复杂的操作,⽽且这些操作都是⼀次性的,⽤完之后就不再⽤了。
⽤存储过程的话就太⿇烦,⽽且浪费,⽤完了还要去删除。
⽽单个SQL⽆法满⾜需求。
这时候⽤⼀下SQL的语句块就可以了。
如果你⽤的是Oracle数据库,那么你就可以⽤PL/SQL(Procedure Language/SQL),即过程化查询语⾔。
这是第三代语⾔。
⽽我们⽤的SQL是结构化查询语⾔,属于第四代语⾔。
PL/SQL能够实现更加复杂的逻辑操作,像我们使⽤Java,C等⾼级语⾔⼀样。
但如果是在MYSQL/SQLSERVER数据库中,那PL/SQL 就⽆法使⽤(PL/SQL是属于Oracle的过程查询语⾔)。
如果你要在MYSQL/SQLSERVER实现复杂的逻辑查询,那你只能通过编写存储过程实现。
下⾯对PL/SQL常⽤的⼀些基础知识进⾏讲解。
在讲解之前,先创建⼀个⽤于测试的表:--创建测试表create table t_plsql_test(id varchar(10),name varchar(100),mDate date);--插⼊测试数据insert into t_plsql_test values(1, 'one', to_date('1992/03/08', 'YYYY/MM/DD'));insert into t_plsql_test values(2, 'one', to_date('1993/03/08', 'YYYY/MM/DD'));insert into t_plsql_test values(3, 'one', to_date('1994/03/08', 'YYYY/MM/DD'));commit;--查看select * from t_plsql_test;⼀、PL/SQL的结构[declare] --变量声明(可以省略) --如:my_var varchar(200);begin --SQL语句[exception] --异常声明(可以省略) end;例如:declarenowDate date:= sysdate;BEGINupdate t_plsql_testset mdate = nowDatewhere id = 3;commit;END;--查看select * from t_plsql_test;⼆、PL/SQL的基本规则1、标识符不区分⼤⼩写,所有的名称在存储时⾃动改成⼤写。
oracle if控制语句经典实例及详解
Oracle条件分支语句使用案例pl/sql中提供了三种条件分支语句if---then,if---then---else,if--then---elsif---else。
这里需要注意一个细节(细节决定成败):elsif而不是elseif。
一:简单的条件判断:if--then案例1:编写一个过程,可以输入一个雇员名,如果该雇员的工资低于2000,就给该雇员工资增加10%。
create or replace procedure sp_p2(spName varchar2) isv_sal emp.sal%type;beginselect sal into v_sal from emp where ename=spName;if v_sal<2000 thenupdate emp set sal=sal*1.1 where ename=spName;end if;end;案例2:修改emp表的数据,把那些小于2000的员工工资增加10%,并把更新前后的工资显示出来。
create or replace procedure sp_p2(spName varchar2) is --执行存储过程时要用的变量。
v_sal emp.sal%type;v_sal1 emp.sal%type; --定义两个与emp表中sal列的字符类型相同。
beginselect sal into v_sal from emp where ename=spName;--把得到的数据存到变量里边。
if v_sal<2000 thenupdate emp set sal=sal*1.1 where ename=spName;select sal into v_sal1 from emp where ename=spName;dbms_output.put_line('旧工资为:'||v_sal); --表的列不能在这里用,需要通过定义变量和存储值来实现。
sql server 循环语句
sql server 循环语句SQL Server循环语句是编写存储过程时非常重要的一部分,它可以帮助我们在不同条件下重复执行一组语句。
本文将简要介绍SQL Server循环语句的种类和用法。
循环语句主要有以下种类:1. WHILE循环WHILE循环用于在指定条件为真的情况下,重复执行一组语句。
其基本语法如下:```WHILE conditionBEGINstatement1statement2…statementNEND```其中,WHILE后面的condition是一个布尔型表达式,只有在条件为TRUE时,才会执行循环体内的语句。
循环体内的多个语句,需要用BEGIN和END括起来。
2. REPEAT循环REPEAT循环是一种后测试循环,即先执行循环体内的语句,再检查条件是否成立。
如果条件不成立,则退出循环。
其基本语法如下:```REPEATstatement1statement2…statementNUNTIL condition```其中,UNTIL后面的condition也是一个布尔型表达式,在条件为TRUE时,循环结束。
REPEAT循环有时也称为“DO WHILE循环”。
3. FOR循环FOR循环是一种计数循环,用于指定循环执行的次数。
其基本语法如下:```FOR index = start TO end [STEP step]BEGINstatement1statement2…statementNEND```其中,index是循环计数器,start和end分别是计数器的起始值和结束值。
可以通过指定STEP来指定计数器的增量,默认为1。
4. CURSOR循环CURSOR循环是一种遍历记录集的循环。
其基本语法如下:```DECLARE cursor_name CURSOR FOR SELECT_statementOPEN cursor_nameFETCH NEXT FROM cursor_name INTO variablesWHILE @@FETCH_STATUS = 0BEGINstatement1statement2…statementNFETCH NEXT FROM cursor_name INTO variablesENDCLOSE cursor_nameDEALLOCATE cursor_name```其中,DECLARE语句用于定义一个游标,SELECT_statement用于指定游标遍历的记录集。
OraclePLSQL中的循环处理(sqlfor循环)
OraclePLSQL中的循环处理(sqlfor循环)今年春节算是休了个长假,调整好⼼态,迎接新⼀年的挑战。
今天来说下Oracle中的循环迭代处理,因为从⾃⼰的博客统计中看到,不少⽹友都搜索了关键字"SQL FOR循环",所以打算在这⾥说下个⼈的理解。
PL/SQL也和我们常⽤的编程语⾔⼀样,提供了While、For等循环,我们建⼏个例⼦来说明演⽰下。
⾸先是While循环:--while循环procedure loop_while(start_value in number,end_value in number)iscurrent_value number := start_value;beginwhile current_value <=end_valueloopdbms_output.put_line('now number:'|| current_value);current_value:=current_value+1;end loop;end loop_while;指定循环的初始值和结束值之后,就可以看到将这2个值之间的数字⼀⾏⾏打印出来了;当然只要while循环条件的求值结果是true,循环就会继续下去,如果求值条件为false或者null,循环就会终⽌。
这个循环条件每执⾏⼀次循环体之前都会先进⾏判断,因此while循环并不能保证循环体⼀定能被执⾏。
所以如果我们⽆法提前预知所需要巡检的次数的情况下,就可以使⽤While来进⾏循环处理。
For循环有2种,分别是数值型FOR循环和游标型FOR循环:--数值型For循环procedure loop_num_for(lowest in number,highest in number)isbeginFOR even_number in lowest .. highest --升序loop--处理⾮平滑增长的索引if mod(even_number,2)=0thendbms_output.put_line('now number:'|| even_number);end if;end loop;end loop_num_for;这种循环在开始的时候就已经知道循环的次数了,注意这⾥不需要声明循环索引,因为PL/SQL会⾃动隐式的⽤⼀个integer类型的局部变量作为它的循环索引;如果要降序循环,必须加上reverse关键字,并且循环上边界和下边界的顺利⽆需改变:FOR even_number in reverse lowest .. highestloopdbms_output.put_line('now number:' || even_number);end loop;另外需要说明的是,数值型FOR循环中,索引总是以1为单位递增或递减,所以如果我们的循环条件并⾮如此理想的平滑增长,我们就必须⽤⼀些逻辑代码或者技巧来达到我们的⽬的。
关于在PLSQL中使用正确的循环控制
前面的代码将返回 ORA-01403 错误:由于缺少索引1,没有发现数据。
如果你尝试使用 .FIRST/.LAST 修正这个问题,那么你将自动地从第一个索引开始循环,直到到达最后一个索引,如下:
Declare
type mylist_type is table of number index by pls_integer;
mylist mylist_type;
begin
mylist(2) := 2;
mylist(3) := 3;
mylist(6) := 6;
foralli in indices of mylist
insert into mynumtable values(mylist(i));
end;
/
另外还有一个 VALUES OF 子句,该子句使用你的嵌套表的值,或者被表索引的值作为循环的下标:
Declare
type mysubs_type is table of pls_integer index by pls_integer;
type mylist_type is table of number index by pls_integer;
end;
/
然而,Oracle 10g中引入了两个新子句,这两个子句允许你避免这种局限性。向 FORALL 语法添加一个 INDICES OF 子句允许你自动地循环一个表中的所有值,而无须担心索引是否存在:
Declare
type mylist_type is table of number index by pls_integer;
关于在PL/SQL中使用正确的循环控制
SQL循环语句while介绍实例
SQL循环语句while介绍实例declare @i intset @i=1while @i<30begininsert into test (userid) values(@i)set @i=@i+1end---------------while 条件begin执⾏操作set @i=@i+1endWHILE设置重复执⾏ SQL 语句或语句块的条件。
只要指定的条件为真,就重复执⾏语句。
可以使⽤ BREAK 和 CONTINUE 关键字在循环内部控制 WHILE 循环中语句的执⾏。
语法WHILE Boolean_expression{ sql_statement | statement_block }[ BREAK ]{ sql_statement | statement_block }[ CONTINUE ]参数Boolean_expression返回 TRUE 或 FALSE 的表达式。
如果布尔表达式中含有 SELECT 语句,必须⽤圆括号将 SELECT 语句括起来。
{sql_statement | statement_block}Transact-SQL 语句或⽤语句块定义的语句分组。
若要定义语句块,请使⽤控制流关键字 BEGIN 和 END。
BREAK导致从最内层的 WHILE 循环中退出。
将执⾏出现在 END 关键字后⾯的任何语句,END 关键字为循环结束标记。
CONTINUE使 WHILE 循环重新开始执⾏,忽略 CONTINUE 关键字后的任何语句。
注释如果嵌套了两个或多个 WHILE 循环,内层的 BREAK 将导致退出到下⼀个外层循环。
⾸先运⾏内层循环结束之后的所有语句,然后下⼀个外层循环重新开始执⾏。
⽰例A. 在嵌套的 IF...ELSE 和 WHILE 中使⽤ BREAK 和 CONTINUE在下例中,如果平均价格少于 $30,WHILE 循环就将价格加倍,然后选择最⾼价。
postsql循环语句
postsql循环语句
PostgreSQL循环语句是一种控制结构,它允许程序重复执行一组语句,直到达到特定条件。
在PostgreSQL中,我们可以使用三种循环语句:WHILE、FOR和LOOP。
WHILE循环是一种基本的循环结构,它重复执行一组语句,直到达到特定条件。
例如:
```
WHILE (condition) LOOP
statements;
END LOOP;
```
FOR循环是一种更高级的循环结构,它可以在循环中使用迭代器。
例如:
```
FOR variable IN range LOOP
statements;
END LOOP;
```
LOOP是一种无限循环,它会一直执行,直到条件被满足并通过EXIT语句退出循环。
例如:
```
LOOP
statements;
IF condition THEN
EXIT;
END IF;
END LOOP;
```
在使用循环语句时,我们需要注意避免死循环和保证循环的终止条件。
同时,循环语句也可以与条件语句和分支结构配合使用,从而实现更灵活的程序控制。
总之,在PostgreSQL中使用循环语句可以帮助我们提高程序的效率和灵活性,使得代码更加清晰和易于维护。
数据库培训-PLSQL
综合例子
思路:
题目
*
*
隐式游标
隐式游标也叫sql游标,是用来处理所有sql语句的环境区域指针; 不能通过专门的语句来打开,PL/SQL隐式的打开sql游标处理完后自动关闭。 单条sql语句所产生的结果集合 用关键字SQL表示隐式游标 4个属性 %rowcount 影响的记录的行数 整数 %found 影响到了记录 true %notfound 没有影响到记录 true %isopen 是否打开 布尔值 永远是false 多条sql语句 隐式游标SQL永远指的是最后一条sql语句的结果 主要使用在update 和 delete语句上
*
异常处理
系统预定义的异常 自定义异常 声明:异常名 EXCEPION; 产生异常:raise语句 异常处理
*
存储过程和函数
没有名字的PL/SQL块(匿名) 有名字的PL/SQL块(子程序-存储过程和函数) 存储过程 create or replace procedure p1 as begin exception end; <最简单的存储过程> create or replace procedure p_jd as hello varchar2(20); begin select 'Hello World' into hello from dual; dbms_output.put_line(hello); end; 执行存储过程的方法 <1> execute p_jd; (SQL*PLUS中SQL>) <2> begin p_jd; end;
*
fetch游标
*
游标属性
游标的属性4种 %notfound fetch是否提到数据 没有true 提到false %found fetch是否提到数据 有true 没提到false %rowcount 已经取出的记录的条数 %isopen 布尔值 游标是否打开 declare --类型定义 cursor cc is select empno,ename,job,sal from emp where job = 'MANAGER'; --定义一个游标变量 ccrec cc%rowtype; begin --打开游标 open cc; --loop循环 loop --提取一行数据到ccrec中 fetch cc into ccrec; --判断是否提取到值,没取到值就退出 --取到值cc%notfound 是false --取不到值cc%notfound 是true exit when (cc%notfound or cc%rowcount =3); dbms_output.put_line(cc%rowcount||'-'||ccrec.empno||'-'||ccrec.ename||'-'||ccrec.job||'-'||ccrec.sal); end loop; --关闭 close cc; end;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
x number(10, 2) := 10;
begin
loop
x := x - 1;
dbms_output.put_line('x的值 ' || x);
exit when x < 1;
end loop;
dbms_output.put_line('x的值 ' || x);
END LOOP;
END;
--改为while循环
DECLARE
v_country_id locations.country_id%TYPE := 'CA';
v_location_id locations.location_id%TYPE;
v_city locations.city%TYPE := 'Montreal';
end;
--3.for循环
declare
-- x number(10, 2);
begin
for x in REVERSE 1 .. 10 loop
dbms_output.put_line('x的值 ' || x);
end loop;
end;
Hale Waihona Puke 深化练习 /*三种循环的练习*/
END;
--改为标准循环
DECLARE
v_country_id locations.country_id%TYPE := 'CA';
v_location_id locations.location_id%TYPE;
v_city locations.city%TYPE := 'Montreal';
x number(9, 2) := 0;
BEGIN
SELECT MAX(location_id)
INTO v_location_id
FROM locations
WHERE country_id = v_country_id;
LOOP
v_city locations.city%TYPE := 'Montreal';
BEGIN
SELECT MAX(location_id)
INTO v_location_id
FROM locations
WHERE country_id = v_country_id;
end;
--2.while循环
declare
x number(10, 2) := 10;
begin
while x>1 loop
x := x - 1;
dbms_output.put_line('x的值 ' || x);
end loop;
dbms_output.put_line('x的值 ' || x);
1.Loop循环
loop
exit when x < 1;
end loop;
2.While循环
while x>1 loop
end loop;
3. for循环
for x in REVERSE 1 .. 10 loop
end loop;
举例
--1.Loop循环
x := x + 1;
INSERT INTO locations
(location_id, city, country_id)
VALUES
((v_location_id + x), v_city, v_country_id);
END LOOP;
x:=x+1;
dbms_output.put_line(v_location_id);
INSERT INTO locations
(location_id, city, country_id)
VALUES
((v_location_id + x), v_city, v_country_id);
exit when x>3;
END LOOP;
END;
FOR i IN 1 .. 3 LOOP
dbms_output.put_line(v_location_id);
INSERT INTO locations
(location_id, city, country_id)
VALUES
((v_location_id + i), v_city, v_country_id);
x number(9, 2) :=0;
BEGIN
SELECT MAX(location_id)
INTO v_location_id
FROM locations
WHERE country_id = v_country_id;
while x <3 LOOP
select * from locations l where country_id='CA' order by l.location_id desc ;
DECLARE
v_country_id locations.country_id%TYPE := 'CA';
v_location_id locations.location_id%TYPE;