oracle之PLSql语言(二)sql语句的使用

时间:2022-03-06 23:25:40

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

比较全面的博文:点击打开链接