PL/SQL第一课(学习笔记)

时间:2022-09-14 20:14:02

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