/*
===========================================================
| 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;