oracle plsql语句、游标

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;
/
--还有带参数的游标

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值