PLSql 强化

古城微笑少年丶 2021-12-05 14:53 469阅读 0赞

1 在使用游标的时候,游标会产生四个属性:%found、%notfound、%isopen 和%rowcount,下面以隐式游标为例来看下游标属性的使用方法。

  1. BEGIN
  2. --update 语句会产生一个游标,我们会获取到相应的游标属性
  3. UPDATE cux_cursor_test t SET t.age = 30 WHERE t.person_name = 'Herry';
  4. IF SQL%FOUND THEN
  5. dbms_output.put_line('Herry 更新了几条记录:' || SQL%ROWCOUNT);
  6. ELSIF SQL%NOTFOUND THEN
  7. dbms_output.put_line('Herry 在表中不存在');
  8. END IF;
  9. --delete 语句会产生一个游标,我们会获取到相应的游标属性
  10. DELETE cux_cursor_test p WHERE p.person_name = 'Abc';
  11. IF SQL%FOUND THEN
  12. dbms_output.put_line('Abc 删除了几条记录' || SQL%ROWCOUNT);
  13. ELSIF SQL%NOTFOUND THEN
  14. dbms_output.put_line('Abc 在表中不存在');
  15. END IF;
  16. --insert 语句会产生一个游标,我们会获取到相应的游标属性
  17. INSERT INTO cux_cursor_test
  18. VALUES
  19. (103,
  20. 'Peter',
  21. 28);
  22. IF SQL%FOUND THEN
  23. dbms_output.put_line('Peter 插入了几条记录:' || SQL%ROWCOUNT);
  24. ELSIF SQL%NOTFOUND THEN
  25. dbms_output.put_line('无数据可以插入');
  26. END IF;
  27. END;

2 %rowcount r它随每次fetch而累计:

参考文章

3 %notfound:It returns TRUE if an INSERT, UPDATE, or DELETE statement affected no rows, or a SELECT INTO statement returned no rows. Otherwise, it returns FALSE.

参考文章

4 匿名plsql存储过程:

  1. declare
  2. MESSAGE VARCHAR2(35) := 'Tihs is my firet PL/SQL program';
  3. DATE_WRITTEN date := sysdate;
  4. begin
  5. insert into temp(char_store,date_store) values(MESSAGE,DATE_WRITTEN);
  6. exception
  7. when others then
  8. dbms_output.put_line(sqlcode||' '||sqlerrm);
  9. end;

5.存储过程(procedure):给一个员工换工作,输入员工id,新工作id,新工作薪水为新工作最低工资加500。

  1. CREATE OR REPLACE PROCEDURE add_job_hist
  2. (
  3. v_employee_id IN NUMBER,
  4. v_new_job_id IN VARCHAR2
  5. ) IS
  6. v_hire_date DATE;
  7. v_job_id VARCHAR2(100);
  8. v_department_id NUMBER;
  9. v_salary NUMBER;
  10. BEGIN
  11. -- 查询新工作最低薪水
  12. SELECT min_salary INTO v_salary FROM jobs WHERE job_id = v_new_job_id;
  13. -- 查询员工原始工作信息
  14. SELECT hire_date,
  15. job_id,
  16. department_id
  17. INTO v_hire_date,
  18. v_job_id,
  19. v_department_id
  20. FROM employees
  21. WHERE employee_id = v_employee_id;
  22. -- 工作记录表,添加一条历史记录
  23. INSERT INTO job_history
  24. (employee_id,
  25. start_date,
  26. end_date,
  27. job_id,
  28. department_id)
  29. VALUES
  30. (v_employee_id,
  31. v_hire_date,
  32. SYSDATE,
  33. v_job_id,
  34. v_department_id);
  35. -- 修改员工表job_id,salary,hire_date
  36. UPDATE employees
  37. SET hire_date = SYSDATE,
  38. job_id = v_new_job_id,
  39. salary = v_salary + 500
  40. WHERE employee_id = v_employee_id;
  41. -- 提交
  42. commit;
  43. END;
  1. 函数(function):查询员工已工作年数

    create or replace function get_service_years(v_id number) return number is
    v_res number := 0;
    v_cnt number := 0;
    e_invalid_emp_id exception;
    cursor cur is select (end_date - start_date) day_s from job_history where employee_id = v_id;
    begin
    select count(*) into v_cnt from job_history where employee_id = v_id;
    if v_cnt <= 0 then raise e_invalid_emp_id;
    end if;
    for c_row in cur

    1. loop
    2. v_res := v_res + c_row.day_s;
    3. end loop;

    v_res := v_res / 365;
    return v_res;
    exception

    1. when e_invalid_emp_id then
    2. dbms_output.put_line('error: invalid emplloyee id');
    3. return null;
    4. when others then
    5. dbms_output.put_line(sqlerrm);
    6. return null;

    end;

发表评论

表情:
评论列表 (有 0 条评论,469人围观)

还没有评论,来说两句吧...

相关阅读

    相关 plsql安装

    1、plsql都需要安装oracle的客户端,不过也可以安装瘦客户端,完整的客户端太大了,俗称胖客户端,一般瘦客户端就可以满足, 本人下载的是instantclient-ba

    相关 PLSQL

    PL/SQL表 一,什么是PL/SQL表? 首先PL/SQL表和记录(Record)一样,都是复合数据类型。可以看做是一种用户自定义数据类型。 PL/SQL表由多列单

    相关 PLSQL

     一、PLSQL语句块 这里的赋值是:=; 判断相等用单个等号; 字符串链接用||; 1.完整的PLSQL语句块 DECLARE \--这里声明变量 BEG

    相关 PLSql 强化

    1 在使用游标的时候,游标会产生四个属性:%found、%notfound、%isopen 和%rowcount,下面以隐式游标为例来看下游标属性的使用方法。 BEG

    相关 安装plsql

    注意:下载的版本要在一个大版本内,我的下载的都是12系列,现在新的是18系列. 1.下载InstantClient客户端: [https://www.oracle.

    相关 PLSQL僵死

    同样的SQL语句,同一数据库,但在不同的PLSQL中执行,出现僵死的问题。 修改SQLNET.ORA文件的SQLNET.EXPIRE\_TIME值为10,10为默认值。 转