文档章节

聊聊oracle(三)plsql语句、游标

你我他有个梦
 你我他有个梦
发布于 2015/12/18 23:03
字数 558
阅读 13
收藏 0

plsql语句

SELECT * FROM jobs


--求jobs表中总裁最低工资的编号,如果对应记录太多抛出相应异常,没有记录则抛出没有记录的异常

DECLARE
v_result VARCHAR(20);
BEGIN
   SELECT job_id INTO v_result FROM jobs WHERE min_salary>2000;
   dbms_output.put_line('总裁最低工资编号:'||v_result);
   EXCEPTION
     WHEN no_data_found THEN
       dbms_output.put_line('没有对应的记录');
       WHEN too_many_rows THEN
       dbms_output.put_line('对应记录太多!');        
END;


/

--定义记录类型的变量

DECLARE

`TYPE product_rec IS RECORD
(
       v_productid productinfo.productid%TYPE,--代表v_productid的类型和productinfo表中productid的类型一样
       v_product_name VARCHAR2(20),
       v_product_type VARCHAR(20)
)

v_product product_rec;

BEGIN
           SELECT productid,productname,producttype INTO v_product FROM productinfo;
           dbms_output.put_line(v_product.v_productid);   

END;


/
--%rowtype,将变量的类型设置为表类型

DECLARE

v_result productinfo%ROWTYPE;

BEGIN
SELECT * INTO v_result FROM productinfo;
END;


/


--if  elseif  end if结构,也可以嵌套使用,case语句



--loop结构

DECLARE

v_num NUMBER(8) :=1;

BEGIN
<<basic_LOOP>>
LOOP
         v_num := v_num+1;
         IF
             v_num>10 THEN
             dbms_output.put_line('当前v_num的值是:'||v_num);
             EXIT basic_LOOP;
           
         END IF; 
END LOOP;

END;


/

--while loop

 

DECLARE

v_num NUMBER(8) :=1;

BEGIN
<<basic_LOOP>>
WHILE v_num<20
LOOP
         v_num := v_num+1;
         IF
             MOD(v_num,4)=0 THEN
             dbms_output.put_line('当前v_num的值是:'||v_num);
             EXIT basic_LOOP;
           
         END IF; 
END LOOP;

END;


/
--使用for  loop计算0-20之间的整数和

DECLARE
         v_num NUMBER(8):=1;
BEGIN
  <<for_loop>>
  FOR inx IN 1..20 LOOP
      v_num := v_num+inx;  
  END LOOP;
dbms_output.put_line('当前v_num的值是:'||v_num);
END;


/
--自定义异常

DECLARE
salary jobs.min_salary%TYPE;
msg_exc EXCEPTION;
PRAGMA Exception_Init(msg_exc,-20001);
BEGIN
SELECT  min_salary INTO salary FROM jobs WHERE job_id='AD_PRES';
IF salary>10000 THEN
   RAISE msg_exc;
END IF;
dbms_output.put_line('工资是:'||salary);
EXCEPTION
   WHEN msg_exc THEN
dbms_output.put_line('工资不符合标准'||'error code:'||SQLCODE);
WHEN no_data_found THEN
    dbms_output.put_line('没有对应的数据');
END;


/

 

游标

--loop

DECLARE
  CURSOR JOB_LOOP IS
    SELECT JOB_ID, JOB_TITLE, MIN_SALARY, MAX_SALARY FROM JOBS;

  CUR_JOBID     JOBS.JOB_ID%TYPE;
  CUR_JOBTITLE  JOBS.JOB_TITLE%TYPE;
  CUR_MINSALARY JOBS.MIN_SALARY%TYPE;
  CUR_MAXSALARY JOBS.MAX_SALARY%TYPE;

BEGIN

  OPEN JOB_LOOP;
  LOOP
    FETCH JOB_LOOP
      INTO CUR_JOBID, CUR_JOBTITLE, CUR_MINSALARY, CUR_MAXSALARY;
    EXIT WHEN JOB_LOOP%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE('工作id:' || CUR_JOBID || ',    职称:' ||
                         CUR_JOBTITLE || ',   最低工资:' || CUR_MINSALARY ||
                         ',   最高工资:' || CUR_MAXSALARY);
  END LOOP;
  CLOSE JOB_LOOP;

END;


/
--bult collect  for实现同样的效果,rowtype对应一行记录所有的列,会跟所有的列类型一样
 

DECLARE CURSOR JOB_LOOP IS
  SELECT JOB_ID, JOB_TITLE, MIN_SALARY, MAX_SALARY FROM JOBS;

TYPE JOB_TAB IS TABLE OF JOBS%ROWTYPE;
JOB JOB_TAB;

BEGIN

  OPEN JOB_LOOP; --也可以做增删改查操作
  LOOP
    FETCH JOB_LOOP BULK COLLECT
      INTO JOB;
    FOR I IN 1 .. JOB.COUNT LOOP
   
      DBMS_OUTPUT.PUT_LINE('工作id:' || JOB(I).JOB_ID || ',    职称:' || JOB(I)
                           .JOB_TITLE || ',   最低工资:' || JOB(I).MIN_SALARY ||
                           ',   最高工资:' || JOB(I).MAX_SALARY);
    END LOOP;
    EXIT WHEN JOB_LOOP%NOTFOUND;
  END LOOP;
  CLOSE JOB_LOOP;

END;


/
--还有带参数的游标

 

© 著作权归作者所有

你我他有个梦

你我他有个梦

粉丝 95
博文 110
码字总数 98858
作品 0
昌平
程序员
私信 提问
PLSQL 之类型、变量和结构

1、类型 在《.Net程序员学用Oracle系列(5):三大数据类型》一文中详细地讲述了 Oracle 的基本数据类型,文中还提到,除基本数据类型之外,Oracle 还在语法上支持一些非固有数值类型。 事实上...

技术小阿哥
2017/11/05
0
0
Oracle-14:PLSQL

------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- PL/SQL PL/SQL(Procedural Language):过程化sql语言! 在原本的sql语句之上,再增加一些逻辑或者循环等操作。 1:基本语法 ...

晨曦dawn
2018/05/22
0
0
Oracle 中的动态 SQL

动态SQL也被称作通用的或集合的SQL。它与其它任何在运行时生成的动态代码类似;它基于运行时的数值与变量而不是明确字符串。 当我们写了一些代码又希望改变选择的列,以及想基于我们的商务需...

等PM
2013/03/24
517
0
oracle体系结构--实例

实例SID: 内存结构加上后台进程构成,是访问数据库的一种途径 内存结构加上后台进程构成,是访问数据库的一种途径 做数据恢复时,利用第三方工具,不需要访问实例,其余都要访问实例 使用o...

柳白子
2016/12/02
4
0
Oracle专题11之PLSQL入门

1、PLSQL工具 PL/SQL Developer的简介:PL/SQL Developer是一种专门用于开发、测试、调试和优化Oracle PL/SQL的一种工具,更是一个非常好用的Oracle的管理工具。 官网下载地址:https://www...

极客微信条
2017/12/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Fundebug录屏插件更新至0.4.0,修复Safari/WKWebView下录制失败的问题

此次更新对插件做了多方面的升级,主要包含 BUG 修复和性能优化两个方面。 BUG 修复 Safari 浏览器和 WKWebView 下数据为空 由于 Safari 浏览器和 WKWebView 数据编码的处理方式和其它浏览器...

Fundebug
30分钟前
2
0
Rancher发布Rio:为Kubernetes打造极简MicroPaaS平台

Rio已于近日正式发布!一个结合了Istio、Knative和Kubernetes的力量,且拥有像Docker一样的极简使用体验的MicroPaaS平台。 2019年5月21日,业界领先的容器管理软件提供商Rancher Labs(以下简...

RancherLabs
32分钟前
4
0
Vuex新手的理解与使用

1 vuex的概念理解 提到vuex,就不能不先提vue. 我个人开始尝试学习使用vue,是因为此前总是遇到页面逻辑数据与视图的一致性问题.在使用vue之前,我们使用jQuery插件的时候,一桩麻烦事就是既要在...

社哥
41分钟前
3
0
threejs 之 复制删除正方体

这是threejs官方的一个例子webgl_interactive_voxelpainter.html 查看效果 查看效果 红色的正方体随着鼠标的移动而移动,单击时会创建另一个正方体,按住shift单击会删除点击的正方体。 主要...

tianyawhl
44分钟前
2
0
ZStack CMP多云管理平台有何不同?

作者:ZStack丁阔 文章导读:2019年4月16日,ZStack新品和合作伙伴战略发布会上,面向集团客户和边缘场景需求,ZStack重磅推出ZStack Mini超融合一体机(以下简称:ZStack Mini)和ZStack多云...

ZStack社区版
48分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部