1、可执行部分(BEGIN):即begin后的语句
PLSql语言的注释
1、注释一行:--
2、注释多行:/* 多行语句 */
组成语句:
-
- 变量赋值语句。
- 流程控制语句。
- 数据查询、数据操纵、事务控制语句。
- 游标语句。
2、可执行部分,SQL语句的注意事项
- 在可执行部分,可以使用SQL语句,但是不是所有的SQL语句都可以使用。
- 可以使用的主要有:SELECT、INSERT、UPDATE、DELETE、COMMIT、ROLLBACK等数据查询、数据操纵或事务控制命令。
- 不能使用CREATE 、ALTER、DROP、GRANT、REVOKE等数据定义和数据控制命令。
说明:
a:在PL/SQL中,SELECT语句必须与INTO子句相配合,在INTO子句后面跟需要赋值的变量。
b:在使用SELECT...INTO...时,结果只能有一条,如果返回了多条数据或没有数据,则将产生错误。
c:在PL/SQL中,SQL语句的语法和交互命令是一样的。
使用dbms_output.put_line();输出语句,必须设置其开启,
使用set serveroutput on命令,serveroutput默认是关闭的。
如果输出字符串,需要添加单引号才可以。
两个单引号代表一个单引号
(一)select的使用
declare
v_name emp.ename%type;
v_sal emp.sal%type; //与%rowtype区分开,%type与表中单个字段的数据类型一致 %rowtype与整个表的数据类型一致
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_emp emp%rowtype;
begin
select * into v_emp from emp where empno = 7369;
dbms_output.put_line(v_emp.ename);
end;
--insert语句
declare
v_deptno dept.deptno%type := 50;
v_dname dept.dname%type := 'aaa';
v_loc dept.loc%type := 'bj';
begin
insert into dept2 values(v_deptno, v_dname, v_loc);
commit; //一定要提交,否则没有意义
end;
--update语句
declare
v_deptno emp2.deptno%type := 10;
v_count number;
begin
update emp2 set sal = sal/2 where deptno = v_deptno;
commit; //一定要提交,否则没有意义
end;
--DDL(数据定义语言)语句的使用
执行ddl语句,需要添加execute immediate
begin
execute immediate 'create table t (nnn varchar2(20) default ''aaa'')';
end;
注释的使用:(sql%rowcount:表示sql语句影响到了几条记录,返回影响的行数)sql是一个关键字,rowcount是sql的一个属性。
declare
v_deptno emp2.deptno%type := 10;
v_count number;
begin
--update emp2 set sal = sal/2 where deptno = v_deptno;
--select deptno into v_deptno from emp2 where empno = 7369;
select count(*) into v_count from emp2;
dbms_output.put_line(sql%rowcount || '条记录被影响');
commit; //一定要提交,否则没有意义
end;
--if语句(注意then的使用位置)
取出7369的薪水,如果<1200,输出'low',如果<2000输出'middle',否则'high'
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
dbms_output.put_line('middle');
else
dbms_output.put_line('high');
end if;
end;
--循环(相当于do while)
declare
i binary_integer := 1;
begin
loop
dbms_output.put_line(i);
i := i + 1;
exit when (i >= 11);
end loop;
end;
相当于while循环
declare
j binary_integer := 1;
begin
while j < 11 loop
dbms_output.put_line(j);
j := j + 1;
end loop;
end;
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;
--错误处理(类似于java中的异常,每个异常都有其对应的名字)
declare
v_temp number(4);
begin
select empno into v_temp from emp where empno = 10;
exception
when too_many_rows then
dbms_output.put_line('太多纪录了');
when others then
dbms_output.put_line('error');
end;
----------
declare
v_temp number(4);
begin
select empno into v_temp from emp where empno = 2222;
exception
when no_data_found then
dbms_output.put_line('没有数据');
end;
--创建事件日志表
create table errorlog
(
id number primary key,
errcode number,
errmsg varchar2(1024),
errdate date
)
--创建序列
create sequence seq_errorlog_id start with 1 increment by 1
--实验
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; //sqlcode关键字,出错的代码
v_errmsg := SQLERRM; //sqlerrm关键字,出错的信息
insert into errorlog values (seq_errorlog_id.nextval, v_errcode, v_errmsg, sysdate);
commit;
end;
3、表达式
操作符 说明
+、- 正、负
+、-、*、/、** 加、减、乘、除、求幂
|| 字符串连接
=、!=、>、>=、<、<= 逻辑比较
IS [NOT] NULL 判断是否为NULL
[NOT] LIKE、[NOT] BETWEEN...AND... 、[NOT] IN 判断
NOT、AND、OR 逻辑非、逻辑与、逻辑或
实例可参考:
http://www.cnblogs.com/xlhblogs/p/3507185.html
http://www.cnblogs.com/younggun/articles/1719937.html
比较全面的博文:点击打开链接