天天看點

Oracle資料庫基本概念了解(3)

/*
===========================================================
|         PL/SQL程式設計
============================================================
*/
--聲明變量
DECLARE
  V_NAME VARCHAR2(20); --一般變量
  V_AGE NUMBER(2);
  v_id   SUN.TUSER.USERID%TYPE:=14;--屬性變量
  v_user SUN.TUSER%ROWTYPE; --行屬性變量
BEGIN
  --賦常量值
  V_NAME:='Tom';
  V_AGE :=20;
  DBMS_OUTPUT.put_line('姓名:'||V_NAME||'年齡:'||V_AGE);
  --SELECT *  FROM SUN.TUSER;
  --通過SELECT INTO給變量指派
  SELECT USERNAME,USERID INTO V_NAME,V_AGE  FROM SUN.TUSER;
 -- WHERE USERID=v_id;
  DBMS_OUTPUT.put_line('姓名:'||V_NAME||'年齡:'||V_AGE);
  --給行屬性變量指派
  select * into v_user from sun.tuser where userid=v_id;
  dbms_output.put_line('----------------------------');
  dbms_output.put_line(v_user.username);
   dbms_output.put_line('----------------------------');
EXCEPTION--異常處理
  WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.put_line('使用者編号不正确!');
  WHEN OTHERS THEN
      DBMS_OUTPUT.put_line('錯誤:'||SQLERRM); 
END;

--循環
/*
===========================================================
|         循環語句
============================================================
*/
declare
  v_count number:=1; --聲明變量并指派
  v_sum number:=0;
begin
  /*loop   --loop循環
    v_sum:=v_sum+v_count;
    v_count:=v_count+1;
    exit when v_count>10;
   end loop;
   */
  /* while v_count<=10 loop  --while 循環
     v_sum:=v_sum+v_count;
     v_count:=v_count+1;
    end loop;*/
   for i in 1..10 loop --for循環
      v_sum:=v_sum+i; 
    end loop; 
   dbms_output.put_line(v_sum);
end;


/*
===========================================================
|         遊标
============================================================
*/

DECLARE 
 --聲明遊标
  CURSOR USER_CUR IS
     SELECT USERID,USERNAME 
     FROM SUN.TUSER;
  V_ID SUN.TUSER.USERID%TYPE;
  V_NAME SUN.TUSER.USERNAME%TYPE;   
BEGIN
  --第一種使用遊标方式
  /* 
 OPEN USER_CUR;--打開遊标
 LOOP   --周遊遊标
     FETCH USER_CUR INTO V_ID,V_NAME;
     EXIT WHEN USER_CUR%NOTFOUND;
     DBMS_OUTPUT.put_line('第'||USER_CUR%ROWCOUNT||'個學生:'||V_ID||' '||V_NAME);
  END LOOP;
  close user_cur; --關閉遊标
  */

  --第二種使用方式  for 周遊遊标  這種方式不用先打開遊标
  for v_user in USER_CUR LOOP
       DBMS_OUTPUT.put_line('第'||USER_CUR%ROWCOUNT||
       '個學生:'||v_user.USERID||
       ' '||V_USER.USERNAME);
    END LOOP;  
END;  


/*
===========================================================
|          存儲過程
============================================================
*/ 
--建立存儲過程
  CREATE or replace PROCEDURE INSERT_USER
  ( V_USERID NUMBER,
   V_NAME VARCHAR2,
   V_PWD VARCHAR2)
   IS
   BEGIN
     INSERT INTO SUN.TUSER(USERID,USERNAME,PWD)
    VALUES(V_USERID,V_NAME,V_PWD);
 END;

/*
===========================================================
|         存儲過程調用 
============================================================
*/ 
--存儲過程調用 
 begin  
 --按位置調用
 --INSERT_USER(14,'111','111') ;
 --按名稱
 INSERT_USER(V_USERID=>15,V_PWD=>'222',V_NAME=>'222') ;
end;  
    
 --符合規則的存儲過程
 CREATE PROCEDURE INSERT_USER2 (
  V_USERID SUN.TUSER.USERID%TYPE, --使用屬性變量
   V_NAME SUN.TUSER.USERNAME%TYPE,
   V_PWD SUN.TUSER.PWD%TYPE,
   ON_FLAG OUT NUMBER,  --輸出參數
   ON_MSG OUT VARCHAR2  
   )
   IS
   BEGIN
     ON_FLAG:=1;
     ON_MSG:='添加成功!';
     INSERT INTO SUN.TUSER(USERID,USERNAME,PWD)
    VALUES(V_USERID,V_NAME,V_PWD);
   EXCEPTION  --異常處理
     WHEN OTHERS THEN 
        ON_FLAG:=SQLCODE; --異常代碼
        ON_MSG:=SQLERRM; --異常資訊輸出變量
        rollback;
 END;
--調用
DECLARE
  V_FLAG NUMBER;
  V_MSG VARCHAR2(100);
BEGIN
   INSERT_USER2(16,'555','555',V_FLAG,V_MSG );
   DBMS_OUTPUT.put_line(V_FLAG||V_MSG);
  -- select * from sun.tuser;
END;