首先,當在cmd里辦入scott密碼提示錯誤時,可以這樣改一下,scott的解鎖命令是:
以system用戶登錄:
cmd
sqlplus system/tigertiger
alter user scott identified by "tiger" account unlock;
--學習塊的結構
--學習定義變量(了解數據類型)及賦值
--了解:各種PL/SQL塊的類型
--塊的結構
--案例:根據工號,輸出員工姓名
SELECT * FROM emp;
--塊!
DECLARE v_empno NUMBER(4); v_ename VARCHAR2(10); BEGIN v_empno := &請輸入工號; --必須要將查詢結果放到變量 SELECT ename INTO v_ename FROM emp WHERE empno=v_empno; dbms_output.put_line(v_ename); END;
--異常
DECLARE v_empno NUMBER(4); v_ename VARCHAR2(10); BEGIN v_empno := &請輸入工號; --必須要將查詢結果放到變量 SELECT ename INTO v_ename FROM emp WHERE empno=v_empno; dbms_output.put_line(v_ename); EXCEPTION WHEN OTHERS THEN dbms_output.put_line('執行出錯了,老板!'); END;
--小結
DECLARE
--變量區(不能在begin..end中定義)
BEGIN
--業務代碼區
excetipn
--異常捕獲區
END;
--定義變量(了解數據類型)
--2種:保存一個值=簡單變量;保存多個值=復合變量
--簡單變量類型:char,varchar2,number,date(同時也列類型),boolean,表.字段%type
--復合變量:表%rowtype,record
DECLARE v_empno NUMBER(4); v_ename VARCHAR2(10); v_job emp.job%TYPE; --如果字段類型改變,腳本不需要改變 BEGIN v_empno := 7566; SELECT ename,job INTO v_ename,v_job FROM emp WHERE empno=v_empno; dbms_output.put_line(v_ename); IF(v_job='MANAGER')THEN dbms_output.put_line('經理,吃過飯沒。'); END IF; END;
--需要同上,將多個變量放到一個記錄對象中
DECLARE v_empno NUMBER(4); my_row emp%ROWTYPE; BEGIN v_empno := 7566; SELECT * INTO my_row FROM emp WHERE empno=v_empno; dbms_output.put_line(my_row.ename||','||my_row.sal); END;
--有時不需要一整列,只需要其中幾個列。此時用record
DECLARE --自定義復合類型 my_emp TYPE my_emp_type IS RECORD( yg_name emp.ename%TYPE, yg_sal emp.sal%TYPE ); my_row my_emp_type; --變量名 數據類型 BEGIN SELECT ename,sal INTO my_row FROM emp WHERE empno=7788; dbms_output.put_line(my_row.yg_name||','||my_row.yg_sal); END;
--擴展:Oracle沒有boolean類型?
--思考:性別 true=男,false=女。缺點?性別=保密。所以Oracle建立用char(1)替代,1=男2=女3=保密4=人妖
--Oracle的各種集合類型,對應 java的數組。
--引用變量:在講解存儲過程以后再講解。
--綁定變量(命令窗口中執行,綁定變量用了 :)
SQL> var name varchar2(10)
SQL> execute :name :='hello';
PL/SQL procedure successfully completed
SQL> print name;
name
---------
hello
如圖:
declare l_dept integer := 20; currtime date := sysdate; l_nam varchar2(20) := to_char(add_months(trunc(sysdate),-12),'yyyymmdd'); -- to_char(sysdate,'MM')-13; type num_list is varray(5) of number; arr_id num_list := num_list(100,101,123,33,234); begin l_dept := 30; dbms_output.put_line(l_dept); dbms_output.put_line(currtime); dbms_output.put_line(l_nam); dbms_output.put_line(arr_id(1)); end;
變量的定義:
l_dept定義的是整型,
currtime為日期型,
l_nam為字符型並往前退12個月的日期賦值,而-- to_char(sysdate,'MM')-13;會出現負數。
type num_list is varray(4) of number;則是定義數據類型為整型的數組,並且數組長度為4,
arr_id num_list := num_list(100,101,123,33,234);則使用num_list定義的數組類型定義arr_id變量,並為arr_id賦值。
dbms_output.put_line函數則會在DMS Output選項卡中輸出,注意:dbms_output.put_line必須放到begin和end之內。
truncate table t4; --清空表里的數據 declare op nvarchar2(100); i int ; j int :=100; begin while j<200 loop select nvl(max(id),0) +1 into i from t4; insert into t4 values(i,j,'test'||i); dbms_output.put_line(i); j:=j+1; end loop; end; -- select * from t4;