1、變量
變量首字符必須是字母;最多30個字符;不能與表、列同名;一行聲明一個變量;含_,$,#,不分大小寫。
變量類型
binary_integer:整數,用於計數
number:數值
char:定長字符串
varchar2:變長字符串
date:日期
long:長字符串,最長2G
boolean:布爾類型,true/false/null,不能在dbms_output中輸出
變量聲明
declare
v_temp number(1);
v_count binary_integer := 0;
v_sal number(7, 2) := 4000.0;
v_date date := sysdate;
v_pi constant number(3, 2) := 3.14;
v_valid boolean := false;
v_name varchar2(20) not null := 'MyName';
begin
--||拼接爲串
dbms_output.put_line('v_name 的值爲:'||v_name||',v_sal 的值爲:'||v_sal);
end;
/
默認不顯示輸出信息,設置:
set serveroutput on size 10000 --最多支持1M
L --顯示語句塊
/ --執行
save c:/plsql_01.txt
dbms_output.put_line('Hello World!');
dbms_output.put('string');
dbms_output.new_line;
@ c:/plsql_01.txt
行註釋:--
塊註釋:/* ... */
(1)字段類型
declare
v_sal emp.sal%type;
begin
select sal into v_sal from emp where empno = 7369;
if (v_sal < 1200) then
dbms_output.put_line('low');
elsif(v_sal <2000) then --elsif 而不是 elseif
dbms_output.put_line('middle');
else
dbms_output.put_line('high');
end if;
end;
/
(2)數組類型
declare
type type_table_emp_empno is table of emp.empno%type index by binary_integer;
v_empnos type_table_emp_empno;
begin
v_empnos(0) := 7369;
v_empnos(-1) := 9999;
dbms_output.put_line(v_empnos(-1));
end;
/
(3)記錄類型
支持select語句的返回值,使用記錄可以將一行數據看成一個單元處理。
declare
type myrecord is record(
deptno dept.deptno%TYPE, --number,使用與dept表deptno相同類型和長度
dname varchar2(14),
loc varchar2(13)
);
real_record myrecord;
begin
select deptno,dname,loc into real_record from dept where deptno=10;
dbms_output.put_line(real_record.deptno||','||real_record.dname||','||real_record.loc);
end;
/
只能返回一行,不能返回多行。
簡捷方式:
declare
myrec dept%ROWTYPE; --使得myrecord與dept表一行的定義相同,每個元素使用列名。
begin
select * into myrec from dept where deptno=10; --或者
select deptno,dname,loc into myrec from dept where deptno=10;
dbms_output.put_line(myrec.deptno||','||myrec.dname||','||myrec.loc);
end;
/
2.查詢語句
PL/SQL中的select語句必須返回一條記錄且只返回一條記錄,返回多行數據或沒有返回數據均報錯。
定義列類型
declare
v_name emp.ename%type;
v_sal emp.sal%type;
begin
select ename, sal into v_name, v_sal from emp where empno = 7369;
dbms_output.put_line(v_name ||'-'|| v_sal);
end;
/
定義行類型
declare
v_temp emp%rowtype;
begin
select * into v_temp from emp where empno=7369;
dbms_output.put_line(v_temp.ename || ' ' || v_temp.empno);
end;
/
保留變量
:sql%rowcount
declare
v_deptno dept.deptno%type := 10;
v_count number;
begin
update emp set sal = sal/2 where deptno=v_deptno;
--select deptno into v_deptno from emp where deptno =v_deptno;
--select count(*) into v_count from emp;
dbms_output.put_line(sql%rowcount || '條記錄被影響!');
rollback;
end;
/
select empno,ename,sal from emp where deptno=10;
3.DDL語句
begin
execute immediate 'create table tsql (id number(5),sql varchar2(100) default ''select * from emp;'')';
end;
/
4、分支語句
--if分支
declare
a number;
b varchar2(10);
begin
a:=2;
if a=1 then
b:='A';
elsif a=2 then
b:='B';
else
b:='C';
end if;
dbms_output.put_line('b的值爲:'||b);
end;
/
--case分支
declare
a number;
b varchar2(10);
begin
a:=2;
case
when a=1 then b:='A';
when a=2 then b:='B';
else b:='C';
end case;
dbms_output.put_line('b的值爲:'||b);
end;
/
5.循環語句
(1)loop循環
declare
i binary_integer := 1;
begin
loop
dbms_output.put_line(i);
i := i + 1;
exit when ( i>= 11);
end loop;
end;
/
(2)while循環
declare
i binary_integer := 1;
begin
while i < 11 loop
dbms_output.put_line(i);
i := i + 1;
end loop;
end;
/
(3)for循環
begin
for k in 1..10 loop
dbms_output.put_line(k);
end loop;
for k in reverse 1..10 loop
dbms_output.put_line(k);
end loop;
end;
/
6.錯誤處理
--除0異常
declare
v_num number := 0;
begin
v_num := 2/v_num;
dbms_output.put_line(v_num);
exception
when others then
dbms_output.put_line('error');
end;
/
--select異常
declare
test varchar2(10);
begin
select dname into test from dept where deptno=1;
dbms_output.put_line(test);
exception
when NO_DATA_FOUND then
dbms_output.put_line('沒有找到數據');
end;
/
--多個異常
declare
v_temp number(4);
begin
select empno into v_temp from emp where deptno = 10;
exception
when too_many_rows then
dbms_output.put_line('太多記錄了');
when others then
dbms_output.put_line('error');
end;
/
--自定義異常
declare
tname varchar2(10);
e exception;
begin
select dname into tname from dept where deptno=10;
if tname<>'SALES' then
raise e;
end if;
dbms_output.put_line(tname);
exception
when e then
dbms_output.put_line('沒有找指定部門的數據');
end;
/
--記錄錯誤的方法
create sequence seq_errorlog_id start with 1 increment by 1;
create table errorlog
(
id number primary key,
errcode number,
errmsg varchar2(1024),
errdate date
);
declare
v_deptno dept.deptno%type := 10;
v_errcode number;
v_errmsg varchar2(1024);
begin
delete from dept where deptno = v_deptno;
commit;
exception
when others then
rollback;
v_errcode:= SQLCODE; --出錯代碼
v_errmsg := SQLERRM; --出錯信息
insert into errorlog values (seq_errorlog_id.nextval, v_errcode, v_errmsg, sysdate);
commit;
end;
/
select to_char(errdate,'yyyy-mm-dd hh24:mi:ss') from errorlog;
Oracle PL/SQL編程
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.