PL/SQL第一课(学习笔记)
PL/SQL(Procedural Language/SQL) 是在标准SQL的基础山增加了过程化处理的语言
Oracle客户端工具访问Oracle服务器的操作语言
Oracle对SQL的扩充
PL/SQL程序结构
PL/SQL块
1申明部分:DECLARE
2执行部分:BEGIN
3异常处理:EXCEPTION
1-helloworld.sql
--输出语句
DECLARE
v_Num NUMBERL;--定义
v_Str VARCHAR2(20);--定义
BEGIN
v_Num := 2+3;--赋值
DBMS_OUTPUT.PUT_LINE('v_Num = '||v_Num);--显示
END
sql> set serveroutput on --不写则执行脚本不显示在控制台上
sql> @ 1-helloworld.sql --执行地址要写正确,在什么目录就写在什么目录下。
dbms_output.put_line();
标量类型
NUMBER(3,-3) 1234 结果等于1000
小数点向前三位,然后四舍五入。
NUMBER(3,-1) 1234 结果等于1230
BINARY_INTEGER
DECLARE
v_id NUMBER(7);
v_fname VARCHAR(25);
V_salary NUMBER(11,2);
BEGIN
SELECT id,first_name,salary
INTO v_id,v_fname,v_salary
FROM s_emp
WHERE id = 1;
DBMS_OUTPUT.PUT_LINE(v_id||' '|| v_fname||' '|| v_salary);
END
DECLARE
v_FirstName students.fist_name%TYPE;
上面表示,数据类型始终于表里面的该段数据的类型相同。
RECORD类型
建立类型
CREATE
TYPE t_emp IS RECORD(
id s_emp.id%TYPE
)
%ROWTYPE
v_emp s_emp%ROWTYPE
如上则表示 v_emp 与s_emp 保持完全一致。
=====================================
id fist_name dept_id salary
测试
1、使用RECORD
DECLARE
TYPE t_emp IS RECORD(
id s_emp.id%TYPE,
fist_name s_emp.fist_name%TYPE,
dept_id s_emp.dept_id%TYPE,
salary s_emp.salary%TYPE
);
v_emp t_emp;
BEGIN
SELECT id ,fisrt_name ,dept_id ,salary
INTO v_emp
FROM s_emp;
DBMS_OUTPUT.PUT_LINE(v_emp.id ||' '||v_emp.first_name ||' '|| v_emp.dept_id||' '|| v_emp.salary);
END
2、使用%ROWTYPE
DECLARE
v_emp s_emp%ROWTYPE
BEGIN
SELECT * INTO v_emp
FROM s_emp;
DBMS_OUTPUT.PUT_LINE(v_emp.id||' '||v_emp.first_name||' '|| v_emp.dept_id||' '||v_emp.salary);
END
3、
**************************************************************************************************************
变量的作用域与可见性
虽然我知道,我 理解,但是上课我还是没听懂 她到底怎么讲解的
条件语句
IF THEN ELSE END IF
IF BOOLEN_EXPRESSION1 THEN
....
ELSIF BOOLEN_EXPRESSION2 THEN
...
ELSIF ...
ELSE
...
ENDIF;
题目:查询工资提成,大于1500的提成20%,大于1000小于1500的提成10%,小于1000的提成5%
DECLARE
ID s_emp.id%TYPE :=1,
salary s_emp.SALARY%TYPE,
getchash s_emp.SALARY%Type,
BEING
salary := SELECT SALARY FROM s_emp WHERE s_emp.id = ID;
IF salary >=1500 THEN
getchasH =salary * 0.15
ELSIF salary >1000 THEN
getchasH =salary * 0.1
ELSE
getchash =salary * 0.05
END IF
DBMS_OUTPUT.PUTLINE('id = '||id||' getcash = '||getchash);
END
练习:
1、从s_emp中找ID为1-5的员工保存在table类型变量里
DECLARE
TYPE t_emp IS TABLE OF s_emp%ROWTYPE
INDEX BY BINNARY_INTEGEH;
v_emp t_emp;
num NUMBER(1):=1;
BEGIN
LOOP
SELECT *
INTO v_emp (num)
FROM s_emp
WHERE ID = num
num :=num +1;
IF num >=5 THEN
EXIT;
END IF;
END LOOP;
END
2、while
从table类型变量里取出5名员工信息并输出。
BEGIN
WHERE num <6 LOOP
DBMS_OUTPUT_PUTLINE(v_emp(num).id||' '||v_emp(num).salary)
END LOOP;
END