Oracle PL/SQL,游标,过程

1、PL/SQL  语法相关

-- SQL 语言只是访问,操作数据库的语言,而比并不是程序设计语言,因此不能用于程序开发。
-- PL/SQL 是在标准SQl语言上进行过程性扩展后形成的程序设计语言,是一种Oracle数据库特有的,支持应用开发语言;
------------if--------------
DECLARE
   address  VARCHAR2(10) :='Y1';
BEGIN 
   IF (address ='Y') THEN
     dbms_output.put_line('yes');  
   ELSE
     dbms_output.put_line('no');
    END IF;
END;
 
-------------case------------
DECLARE
  ADDRESS NUMBER := 1;
BEGIN
  CASE ADDRESS
    WHEN 1 THEN
      DBMS_OUTPUT.PUT_LINE('1');
    WHEN 2 THEN
      DBMS_OUTPUT.PUT_LINE('2');
    WHEN 3 THEN
      DBMS_OUTPUT.PUT_LINE('3');
    ELSE
      DBMS_OUTPUT.PUT_LINE('4');
  END CASE;
END;
------------LOOP-------------
DECLARE
  NUM NUMBER := 5;
BEGIN
  LOOP
    IF NUM < 0 THEN
      EXIT;
    END IF;
     dbms_output.put_line('H:'||NUM);
    NUM := NUM - 1;
  END LOOP;
END;
----------
DECLARE
  NUM NUMBER := 5;
BEGIN
  LOOP
    EXIT WHEN NUM < 0;
    DBMS_OUTPUT.PUT_LINE('k:' || NUM);
    NUM := NUM - 1;
  END LOOP;
END;
------FOR...IN..LOOP...END-------
BEGIN
  FOR i IN 1..10 LOOP
    DBMS_OUTPUT.PUT_LINE('L:' || i);
    END LOOP;
END;
--------------------------
--%TYPE 定义一个变量,将数据类型与已经定义的数据变量的类型相同,
--或与数据库表的某列的数据类型相同
select * FROM chengji;
DECLARE
  NAME1  CHENGJI.NAME%TYPE;
  SCORE1 CHENGJI.SCORE%TYPE;
BEGIN
  SELECT NAME, SCORE INTO NAME1, SCORE1 FROM CHENGJI WHERE ID = 4;
  DBMS_OUTPUT.PUT_LINE(NAME1 || '-' || SCORE1);
END;

--提供%ROWTYPE操作符, 返回一个记录类型, 其数据类型和数据库表的数据结构相一致
DECLARE
  CJ CHENGJI%ROWTYPE;
BEGIN
  SELECT * INTO CJ FROM CHENGJI WHERE ID = 4;
  DBMS_OUTPUT.PUT_LINE(CJ.NAME || '-' || CJ.SCORE);
END;

2、游标使用

  1.声明游标

  2.打开游标

  3.提取游标

  4.关闭游标

游标属性
%NOTFOUND -- 是否没找打游标
%FOUND -- 是否找到游标
%ROWCOUNT -- 游标行数
%ISOPEN -- 游标是否打开

-- for 循环游标
DECLARE
  CURSOR CJ IS
    SELECT * FROM CHENGJI;
    -- 定义一个游标变量cj_row ,类型为cj的一行类型
  CJ_ROW CJ%ROWTYPE;
BEGIN
  FOR CJ_ROW IN CJ LOOP
    DBMS_OUTPUT.PUT_LINE(CJ_ROW.NAME || '-' || CJ_ROW.COURSE || '-' ||
                         CJ_ROW.SCORE);
  END LOOP;
END;

-- Fetch 游标
DECLARE
  CURSOR CJ IS
    SELECT NAME, COURSE, SCORE FROM CHENGJI;
  CJ_ROW CJ%ROWTYPE;

BEGIN
  OPEN CJ;
  LOOP
    FETCH CJ
      INTO CJ_ROW;
    EXIT WHEN CJ%NOTFOUND;-- 判断是否取到值,没取到值就退出
    DBMS_OUTPUT.PUT_LINE(CJ_ROW.NAME || ',' || CJ_ROW.COURSE || ',' ||
                         CJ_ROW.SCORE);
  END LOOP;
  CLOSE CJ;
END;

3、过程

3.1

-- 创建过程
CREATE OR REPLACE PROCEDURE 存储过程名(参数in,参数out)
AS
-- 变量声明
NAME VARCHAR2(10);
age  INTEGER ;
BEGIN
  --业务逻辑
END;

3.2

CREATE OR REPLACE PROCEDURE PRO_CHENGJI_ID(NAME1 IN chengji.name%TYPE, ID1   IN chengji.id%TYPE) 
AS
BEGIN
  UPDATE CHENGJI SET ID = ID1 WHERE NAME = NAME1;
  COMMIT;
END ;
--执行过程
call  PRO_CHENGJI_ID('王五',4); 

3.3

CREATE OR REPLACE PROCEDURE PRO_CHENGJI_ID(NAME1   IN CHENGJI.NAME%TYPE,
                                           ID1     IN CHENGJI.ID%TYPE,
                                           COURSE1 IN CHENGJI.COURSE%TYPE,
                                           SCORE1  OUT CHENGJI.SCORE%TYPE) AS
BEGIN
  SELECT SCORE
    INTO SCORE1
    FROM CHENGJI
   WHERE NAME = NAME1
     AND ID = ID1
     AND COURSE = COURSE1;
END PRO_CHENGJI_ID;
--执行过程
DECLARE
 score chengji.score%TYPE;
BEGIN 
   PRO_CHENGJI_ID('王五',3,'化学',SCORE); 
   dbms_output.put_line(''||score);
END;

  

原文地址:https://www.cnblogs.com/wangjianly/p/10773967.html