plsql

    科技2025-06-12  16

    PL/SQL

    一、PL/SQL是什么?初步使用


    一、PL/SQL是什么?

    结合了oracle过程语言和结构化查询语言的一种扩展语言. 一个PL/SQL块由三部分组成,即声明部分丶执行部分丶异常处理部分

    --声明 declare v_taxes number :=3500; v_money number ; v_sal number:=1500; begin --执行部分 -- Test statements here if v_sal-v_taxes<1500 then v_money :=(8000-v_taxes)*0.03-0; dbms_output.put_line('应交税1:'|| v_money); elsif v_sal-v_taxes>=1500 and v_sal-v_taxes<4500 then v_money :=(8000-v_taxes)*0.1-105; dbms_output.put_line('应交税:'|| v_money); elsif v_sal-v_taxes>=4500 and v_sal-v_taxes<9000 then v_money :=(8000-v_taxes)*0.2-555; dbms_output.put_line('应交税:'|| v_money); elsif v_sal-v_taxes>=9000 and v_sal-v_taxes<35000 then v_money :=(8000-v_taxes)*0.25-1005; dbms_output.put_line('应交税:'|| v_money); elsif v_sal-v_taxes>=35000 and v_sal-v_taxes<55000 then v_money :=(8000-v_taxes)*0.3-2755; dbms_output.put_line('应交税:'|| v_money); elsif v_sal-v_taxes>=55000 and v_sal-v_taxes<80000 then v_money :=(8000-v_taxes)*0.35-5505; dbms_output.put_line('应交税:'|| v_money); elsif v_sal-v_taxes>=80000 then v_money :=(8000-v_taxes)*0.45-13505; dbms_output.put_line('应交税:'|| v_money); else dbms_output.put_line('没钱'); end if; end;

    sql标识符定义限制 标识符名不能超过30个字符 第一个字符必须为字母 不区分大小写 不能用"-". 不是是sql保留字

    初步使用

    1.注释 – 单行注释 / / 多行注释

    2.PL/SQL数据类型 1.标量数据类型 数字丶字符丶布尔值丶日期时间 number 丶varchar2丶boolean丶date 2.lob数据类型 bfile blob clob nclob 3.属性类型 用于引用变量或数据库列的数据类型.以及表示表中一行的记录类型 %type %rowtype

    3.异常处理

    declare v_rec employee%rowtype; e_empno_is_null exception;--定义异常类型 begin select * into v_rec from employee where empno='7369'; if v_rec.deptno=10 then if v_rec.sal<10000 then update employee set sal=10000 where empno='7369'; dbms_output.put_line('11111'); else dbms_output.put_line('工资不低于10000元'); end if; end if; exception when no_data_found then --数据找不到异常 dbms_output.put_line('不存在!'); when e_empno_is_null then --调用定义异常 dbms_output.put_line('没有找到该编号!'); when others then --其他异常 dbms_output.put_line('出现其他异常'); end;

    4.游标 1.静态游标和动态游标 1.静态游标分为隐式游标和显示游标

    1.显示游标

    declare v_taxes constant number :=3500;--起征点 v_money number ;--税金 v_sum number :=0 ;--总额 v_sal employee.sal%type; cursor emp_cursor is select sal into v_sal from employee; begin open emp_cursor; loop fetch emp_cursor into v_sal; exit when emp_cursor%notfound; if v_sal-v_taxes<1500 then v_money :=(v_sal-v_taxes)*0.03-0; elsif v_taxes>=1500 and v_taxes<4500 then v_money :=(v_sal-v_taxes)*0.1-105; elsif v_taxes>=4500 and v_taxes<9000 then v_money :=(v_sal-v_taxes)*0.2-555; elsif v_taxes>=9000 and v_taxes<35000 then v_money :=(v_sal-v_taxes)*0.25-1005; elsif v_taxes>=35000 and v_taxes<55000 then v_money :=(v_sal-v_taxes)*0.3-2755; elsif v_taxes>=55000 and v_taxes<80000 then v_money :=(v_sal-v_taxes)*0.35-5505; elsif v_taxes>=80000 then v_money :=(v_sal-v_taxes)*0.45-13505; elsif v_taxes>=v_sal then v_money :=v_sal; else null; end if; v_sum :=v_sum+v_money; end loop; close emp_cursor; dbms_output.put_line('总额:'|| v_sum); end;

    使用步骤 1.声明游标 2.打开游标 3.提取游标 4.关闭游标

    2.存储过程

    create or replace procedure get_sals ( cur_salary out sys_refcursor ) as begin open cur_salary for select empno,sal from employee; end; declare v_eno varchar2(20); v_sal number(8,2); v_salary sys_refcursor; begin get_sals(v_salary ); loop fetch v_salary into v_eno,v_sal; if v_salary%found then dbms_output.put_line( 'found'); end if; if v_salary%notfound then dbms_output.put_line( 'notfound'); end if; exit when v_salary%notfound; dbms_output.put_line('员工编号:' || v_eno || ',薪水:' || v_sal); end loop; close v_salary; end;
    Processed: 0.322, SQL: 8