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

沒腿的鳥發表於2017-09-20

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

比較全面的博文:點選開啟連結

相關文章