(本文例子使用经典的scott表)
if语句
格式:
-- 写法:一个条件的判断
IF <布尔表达式> THEN
-- PL/SQL 和 SQL语句
END IF;
-- 或:两个条件的判断
IF <布尔表达式> THEN
-- PL/SQL 和 SQL语句
ELSE
-- 其它语句
END IF;
-- 或:多条件的判断
IF <布尔表达式> THEN
-- PL/SQL 和 SQL语句
ELSIF < 其它布尔表达式> THEN
-- 其它语句
ELSE
-- 其它语句
END IF;
例:判断员工工资的高低
DECLAREv_empno emp.empno%TYPE := &empno; -- 使用输入框输入员工号V_salary emp.sal%TYPE;V_comment VARCHAR2(40);BEGINSELECT sal INTO v_salary FROM emp WHERE empno = v_empno;IF v_salary < 1500 THEN -- 条件判断1:低于1500元V_comment := '太少了,加点吧~!';ELSIF v_salary <3000 THEN -- 条件判断2:低于300元V_comment := '多了点,少点吧~!';ELSE -- 默认V_comment := '没有薪水~!';END IF;DBMS_OUTPUT.PUT_LINE(V_comment);END;
while 语句
格式:
while <布尔表达式> loop
-- PL/SQL 和 SQL语句 (会循环的内容)
end loop;
例:循环输入员工号,根据判断入职日期来设置奖金
DECLAREx NUMBER :=1;BEGINWHILE x<=10 LOOP -- 循环条件DBMS_OUTPUT.PUT_LINE('X的当前值为:'||x); -- 输出x当前的值x:= x+1; -- 自增END LOOP;END;
loop 语句
格式:
loop
-- PL/SQL 和 SQL语句 (会循环的内容)
exit when <布尔表达式>;
-- PL/SQL 和 SQL语句 (会循环的内容)
end loop;
例:循环打印数字
DECLAREi NUMBER(2) := 0;BEGINLOOPi := i + 1; -- 自增DBMS_OUTPUT.PUT_LINE('int 的当前值为:'||i); -- 每循环一次,打印当前i的值EXIT WHEN i=10; -- 循环退出的条件END LOOP;END;
for 语句
格式:
for 循环计数器 in [ REVERSE ] 下限 .. 上限 loop
-- PL/SQL 和 SQL语句 (会循环的内容)
end loop;
说明:每循环一次,循环变量自动加1;使用关键字REVERSE,循环变量自动减1。跟在IN REVERSE 后面的数字必须是从小到大的顺序,而且必须是整数,不能是变量或表达式。可以使用EXIT 退出循环
例:循环输出i值
BEGINFOR i in 1..10 LOOP -- 循环的下限1,上限10DBMS_OUTPUT.PUT_LINE('int 的当前值为: '||i); -- 每循环一次,打印当前i的值END LOOP;END
附1:运算符
| 运算符 | 意义 |
|---|---|
| = | 等于 |
| <> , != , ~= , ^= | 不等于 |
| < | 小于 |
| > | 大于 |
| <= | 小于或等于 |
| >= | 大于或等于 |
| + | 加号 |
| - | 减号 |
| * | 乘号 |
| / | 除号 |
| := | 赋值号 |
| => | 关系号 |
| .. | 范围运算符 |
| || | 字符连接符 |
| IS NULL | 是空值 |
| BETWEEN AND | 介于两者之间 |
| IN | 在一列值中间 |
| AND | 逻辑与 |
| OR | 逻辑或 |
| NOT | 取返,如IS NOT NULL, NOT IN |
附2:scott表
-- 部门表 (主表)CREATE TABLE dept (deptno NUMBER(2) CONSTRAINT PK_DEPT PRIMARY KEY, -- 主键:部门号dname VARCHAR2(14) , -- 部门名称loc varchar2(13) ) ; -- 部门办公地点-- 员工表 (关联部门表)CREATE TABLE emp (empno NUMBER(4) CONSTRAINT PK_EMP PRIMARY KEY, -- 主键:员工号ename VARCHAR2(10), -- 员工姓名job VARCHAR2(9), -- 员工职位mgr NUMBER(4), -- 员工的上级的编号(关联的是自己表的empno)hiredate DATE, -- 员工的入职日期sal NUMBER(7,2), -- 员工工资comm NUMBER(7,2), -- 员工奖金deptno number(2) constraint fk_deptno references dept ); -- 外键:关联部门号-- 工资表 (无主键)CREATE TABLE bonus (enamE VARCHAR2(10) , -- 员工姓名job VARCHAR2(9) , -- 员工职位sal NUMBER, -- 员工工资comm number ) ; -- 员工奖金-- 工资等级表(无主键)CREATE TABLE salgrade (grade NUMBER, -- 等级编号losal NUMBER, -- 符合工资等级的下限值hisal number ); -- 符合工资等级的上限值-- 添加部门INSERT INTO dept VALUES (10,'ACCOUNTING','NEW YORK');INSERT INTO dept VALUES (20,'RESEARCH','DALLAS');INSERT INTO dept VALUES (30,'SALES','CHICAGO');insert into dept values (40,'OPERATIONS','BOSTON');-- 添加员工INSERT INTO emp VALUES(7369,'SMITH','CLERK',7902,to_date('17-12-1980','dd-mm-yyyy'),800,NULL,20);INSERT INTO emp VALUES(7499,'ALLEN','SALESMAN',7698,to_date('20-2-1981','dd-mm-yyyy'),1600,300,30);INSERT INTO emp VALUES(7521,'WARD','SALESMAN',7698,to_date('22-2-1981','dd-mm-yyyy'),1250,500,30);INSERT INTO emp VALUES(7566,'JONES','MANAGER',7839,to_date('2-4-1981','dd-mm-yyyy'),2975,NULL,20);INSERT INTO emp VALUES(7654,'MARTIN','SALESMAN',7698,to_date('28-9-1981','dd-mm-yyyy'),1250,1400,30);INSERT INTO emp VALUES(7698,'BLAKE','MANAGER',7839,to_date('1-5-1981','dd-mm-yyyy'),2850,NULL,30);INSERT INTO emp VALUES(7782,'CLARK','MANAGER',7839,to_date('9-6-1981','dd-mm-yyyy'),2450,NULL,10);INSERT INTO emp VALUES(7788,'SCOTT','ANALYST',7566,to_date('19-04-1987','dd-mm-yyyy')-85,3000,NULL,20);INSERT INTO emp VALUES(7839,'KING','PRESIDENT',NULL,to_date('17-11-1981','dd-mm-yyyy'),5000,NULL,10);INSERT INTO emp VALUES(7844,'TURNER','SALESMAN',7698,to_date('8-9-1981','dd-mm-yyyy'),1500,0,30);INSERT INTO emp VALUES(7876,'ADAMS','CLERK',7788,to_date('23-05-1987','dd-mm-yyyy')-51,1100,NULL,20);INSERT INTO emp VALUES(7900,'JAMES','CLERK',7698,to_date('3-12-1981','dd-mm-yyyy'),950,NULL,30);INSERT INTO emp VALUES(7902,'FORD','ANALYST',7566,to_date('3-12-1981','dd-mm-yyyy'),3000,NULL,20);insert into emp values(7934,'MILLER','CLERK',7782,to_date('23-1-1982','dd-mm-yyyy'),1300,null,10);-- 添加工资等级数据INSERT INTO salgrade VALUES (1,700,1200);INSERT INTO salgrade VALUES (2,1201,1400);INSERT INTO salgrade VALUES (3,1401,2000);INSERT INTO salgrade VALUES (4,2001,3000);
文章转载自全栈精英,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




