设为首页 收藏本站
查看: 1953|回复: 0

[经验分享] oracle plsql常见操作练习

[复制链接]

尚未签到

发表于 2016-7-17 09:56:51 | 显示全部楼层 |阅读模式
这里只是plsql练习的语句
后面有个附件,说明更加详细,这里只贴出按照附件学习的plsql代码

create table test_dept(dept_id number(11) primary key,dept_name varchar2(32));


DECLARE
   Row_id UROWID;
   info VARCHAR2(40);
BEGIN
INSERT INTO test_dept VALUES (100, 'design')
RETURNING rowid, dept_name||':'||to_char(dept_id)
INTO row_id, info;
DBMS_OUTPUT.PUT_LINE('ROWID:'||row_id);
DBMS_OUTPUT.PUT_LINE(info);
END;


DECLARE
   Row_id UROWID;
   info VARCHAR2(40);
BEGIN
update test_dept t set t.dept_name = 'product' where t.dept_name = 'design'
RETURNING rowid, dept_name||':'||to_char(dept_id)
INTO row_id, info;
DBMS_OUTPUT.PUT_LINE('ROWID:'||row_id);
DBMS_OUTPUT.PUT_LINE(info);
END;

DECLARE
   Row_id UROWID;
   info VARCHAR2(40);
BEGIN
delete test_dept t where t.dept_name = 'design'
RETURNING rowid, dept_name||':'||to_char(dept_id)
INTO row_id, info;
DBMS_OUTPUT.PUT_LINE('ROWID:'||row_id);
DBMS_OUTPUT.PUT_LINE(info);
END;


DECLARE
   TYPE test_record IS RECORD(
         Code VARCHAR2(10),
         Name VARCHAR2(30) NOT NULL :='a book');
   V_book test_record;
BEGIN
   V_book.code :='123';
   V_book.name :='C++ Programming';
   DBMS_OUTPUT.PUT_LINE(v_book.code||v_book.name);
END;


DECLARE
   -- 用 %TYPE 类型定义与表相配的字段
   TYPE t_Record IS RECORD(
          T_no test_dept.dept_id%TYPE,
          T_name test_dept.dept_name%TYPE);
   -- 声明接收数据的变量
   v_dept t_Record;
BEGIN
   SELECT dept_id, dept_name INTO v_dept FROM test_dept WHERE dept_id=1000;
   DBMS_OUTPUT.PUT_LINE(TO_CHAR(v_dept.t_no)||v_dept.t_name);
END;

DECLARE
   v_dept_id test_dept.dept_id%TYPE :=&dept_id;
   -- 用 %TYPE 类型定义与表相配的字段
   TYPE t_Record IS RECORD(
          T_no test_dept.dept_id%TYPE,
          T_name test_dept.dept_name%TYPE);
   -- 声明接收数据的变量
   v_dept t_Record;
BEGIN
   SELECT dept_id, dept_name INTO v_dept FROM test_dept WHERE dept_id=v_dept_id;
   DBMS_OUTPUT.PUT_LINE(TO_CHAR(v_dept.t_no)||v_dept.t_name);
END;

DECLARE
    v_dept_id test_dept.dept_id%TYPE :=&dept_id;
    rec test_dept%ROWTYPE;
BEGIN
    SELECT * INTO rec FROM test_dept WHERE dept_id=v_dept_id;
    DBMS_OUTPUT.PUT_LINE('部门编码:'||rec.dept_id||'部门名称:'||rec.dept_name);
END;


INSERT INTO test_dept VALUES (1001, 'humanresource');
INSERT INTO test_dept VALUES (1002, 'market');
INSERT INTO test_dept VALUES (1003, 'product');
INSERT INTO test_dept VALUES (1004, 'service');

DECLARE
TYPE dept_table_type IS TABLE OF
test_dept%ROWTYPE INDEX BY BINARY_INTEGER;
my_dept_table dept_table_type;
v_count number(2) :=4;
BEGIN
FOR id_incr IN 1 .. v_count LOOP
SELECT * INTO my_dept_table(id_incr) FROM test_dept WHERE dept_id=id_incr+1000;
END LOOP;
FOR id_incr IN my_dept_table.FIRST .. my_dept_table.LAST LOOP
DBMS_OUTPUT.PUT_LINE('Department number: '||my_dept_table(id_incr).dept_id);
DBMS_OUTPUT.PUT_LINE('Department name: '|| my_dept_table(id_incr).dept_name);
END LOOP;
END;

select * from test_dept;
alter table test_dept add salary number(11) default 100;

DECLARE
   v_dept_name test_dept.dept_name%TYPE :=&dept_name;
   v_salary   test_dept.salary%TYPE;
BEGIN
   SELECT salary INTO v_salary FROM test_dept WHERE dept_name=v_dept_name;
   IF v_salary>=1500 THEN
        UPDATE test_dept SET salary = salary+100 WHERE dept_name=v_dept_name;
        DBMS_OUTPUT.PUT_LINE('编码为'||v_dept_name||'员工工资已更新!');
   ELSE
   DBMS_OUTPUT.PUT_LINE('编码为'||v_dept_name||'员工工资已经超过规定值!');
   END IF;
EXCEPTION
   WHEN NO_DATA_FOUND THEN
      DBMS_OUTPUT.PUT_LINE('数据库中没有编码为'||v_dept_name||'的员工');
   WHEN TOO_MANY_ROWS THEN
      DBMS_OUTPUT.PUT_LINE('程序运行错误!请使用游标');
   WHEN OTHERS THEN
       DBMS_OUTPUT.PUT_LINE('发生其它错误!');
END;


DECLARE
   v_dept_id test_dept.dept_id%TYPE :=&dept_id;
   e_deptno_remaining EXCEPTION;
   PRAGMA EXCEPTION_INIT(e_deptno_remaining,-00001);
   /* -2292 是违反一致性约束的错误代码 */
BEGIN
   insert into test_dept values(v_dept_id,'manager',5000);
EXCEPTION
   WHEN e_deptno_remaining THEN
      DBMS_OUTPUT.PUT_LINE('违反数据完整性约束!');
   WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE('发生其它错误!');
END;


DECLARE
   v_dept_name test_dept.dept_name%TYPE :=&dept_name;
   no_result_exception  EXCEPTION;
BEGIN
   UPDATE test_dept SET salary=salary+500 WHERE dept_name=v_dept_name;
   IF SQL%NOTFOUND THEN
      RAISE no_result_exception;
   END IF;
   commit;
   DBMS_OUTPUT.PUT_LINE('更新成功');
EXCEPTION
   WHEN no_result_exception THEN
      DBMS_OUTPUT.PUT_LINE('你的数据更新语句失败了!');
   WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE('发生其它错误!');
END;


BEGIN
   insert into test_dept values(2000,'buy',5000);
   DBMS_OUTPUT.PUT_LINE('插入数据记录成功!');
   insert into test_dept values(2000,'buy',5000);
   DBMS_OUTPUT.PUT_LINE('插入数据记录成功!');
EXCEPTION
   WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);
END;

CREATE OR REPLACE FUNCTION test_get_salary(
p_dept_name VARCHAR2,
emp_count OUT NUMBER)
RETURN NUMBER IS
V_sum NUMBER;
BEGIN
SELECT SUM(salary), count(*) INTO V_sum, emp_count
FROM test_dept WHERE dept_name = p_dept_name;
RETURN v_sum;
EXCEPTION
   WHEN NO_DATA_FOUND THEN
      DBMS_OUTPUT.PUT_LINE('你需要的数据不存在!');
   WHEN TOO_MANY_ROWS THEN
      DBMS_OUTPUT.PUT_LINE('程序运行错误!请使用游标');
   WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE('发生其它错误!');
END test_get_salary;

drop function test_get_salary;

DECLARE
V_num NUMBER;
V_sum NUMBER;
BEGIN
V_sum :=test_get_salary('product', v_num);
DBMS_OUTPUT.PUT_LINE('product部门工资总和:'||v_sum||',人数:'||v_num);
END;


DECLARE
V_num NUMBER;
V_sum NUMBER;
BEGIN
V_sum :=test_get_salary(emp_count => v_num, p_dept_name => 'product');
DBMS_OUTPUT.PUT_LINE('product部门工资总和:'||v_sum||',人数:'||v_num);
END;


CREATE OR REPLACE PROCEDURE test_insert_dept_info IS
max_dept_id
BEGIN
     
   INSERT INTO test_dept VALUES(3002,'department1',3000);
   INSERT INTO test_dept VALUES(3002,'department1',3000);
END;


CREATE OR REPLACE PROCEDURE p_test_del_repeat_dept(
p_dept_name varchar2,
del_amount OUT NUMBER)
IS
v_max_dept_id number;
BEGIN
  if p_dept_name<>'' THEN
  SELECT max(dept_id), COUNT(*) INTO v_max_dept_id, del_amount
         FROM test_dept WHERE dept_name = p_dept_name;
  delete test_dept  where dept_id = v_max_dept_id;
  ELSE
  SELECT max(dept_id), COUNT(*) INTO v_max_dept_id, del_amount
         FROM test_dept WHERE dept_name = 'department1';
  delete test_dept  where dept_id = v_max_dept_id;
  END IF;

EXCEPTION
   WHEN NO_DATA_FOUND THEN
      DBMS_OUTPUT.PUT_LINE('你需要的数据不存在!');
   WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE('发生其它错误!');
END p_test_del_repeat_dept;

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-245198-1-1.html 上篇帖子: Oracle 中实现分页语句 下篇帖子: oracle学习笔记(6)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表