斷點

          每天進步一點點!
          posts - 174, comments - 56, trackbacks - 0, articles - 21

          PL/SQL語句

          Posted on 2010-07-24 16:03 斷點 閱讀(317) 評論(0)  編輯  收藏 所屬分類: Oracle DBA

          PLSql是SQL的補充,PL過程語言procedure language,SQL:Structured Query Language。
          PLSql    帶有分支、循環的語言,SQL沒有分支、循環的語言。

          set serveroutput on;

          -- 簡單的PL/SQL語句塊
          declare
           v_name varchar2(20);
          begin
            v_name :='myname';
            dbms_output.put_line(v_name);
          end;
          /


          --語句塊的組成
          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;
          /

          --變量聲明的規則
          1、變量名不能夠使用保留字,如from、select等
          2、第一個字符必須是字母
          3、變量名最多包含30個字符
          4、不要與數據庫的表或者列同名
          5、每一行只能聲明一個變量


          --常用變量類型
          1、binary_integer:整數,主要用來計數而不是用來表示字段類型
          2、number:數字類型
          3、char:定長字符串
          4、varchar2:變長字符串
          5、date:日期
          6、long:長字符串,最長2GB
          7、boolean:布爾類型,可以取值true、false和null值


          --變量聲明
          declare
            v_temp number(1);
            v_count binary_integer :=0;
            v_sal number(7,2):= 4000.00;
            v_date date:= sysdate;
            v_pi constant number(3,2) := 3.14;  --constant相當java的final常量
            v_valid boolean := false;
            v_name varchar2(20) not null :='MyName';
          begin
            dbms_output.put_line('v_temp value:'|| v_temp);
          end;
           

          --變量聲明,使用%type屬性
          declare
            v_empno number(4);
            v_empno2 emp.empno%type;
            v_empno3 v_empno2%type;
          begin
            dbms_output.put_line('Test');
          end;


          --簡單變量賦值
          declare
            v_name varchar2(20);
            v_sal number(7,2);
            v_sal2 number(7,2);
            v_valid boolean :=false;
            v_date date;
          begin
            va_name :='MyName';
            v_sal :=23.77;
            v_sal2 :=23.77;
            v_valid:=(v_sal = v_sal2);
            v_date:=to_date('1999-08-12 12:23:38','YYYY-MM-DD HH24:MI:SS');  
          end;


          --Table變量類型,定義一種新的類型,是數組。
          declare
            type type_table_emp_empno is table of emp.empno%type index by binary_integer;
            v_empno type_table_emp_empno;
          begin
            v_empnos(0) := 7369;
            v_empnos(2) := 7839;
            v_empnos(-1) := 9999;
            dbms_output.put_line(v_empnos(-1));
          end;


          --Record變量類型,類似java的類的概念。
          declare
            type type_record_dept is record
            (
              deptno dept.deptno%type,
              dname dept.dname%type,
              loc dept.loc%type
            );
            v_tmp type_record_dept;
          begin
            v_tmp.deptno := 50;
            v_tmp.dname := 'aaaa';
            v_tmp.loc := 'bj';
            dbms_output.put_line(v_temp.deptno||''||v_temp.dname);
          end;


          --使用%rowtype聲明Record變量
          declare
            v_temp dept%rowtype;
          begin
            v_tmp.deptno := 50;
            v_tmp.dname := 'aaaa';
            v_tmp.loc := 'bj';
            dbms_output.put_line(v_temp.deptno||''||v_temp.dname);
          end;


          --SQL語句的運用,返回數據有且只有一條記錄。
          declare
            v_ename emp.ename%type;
            v_sal emp.sal%type;
          begin
            select ename,sal into v_ename,v_sal from emp where empno = 7369;
            dbms_output.put_line(v_ename||''||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;

          declare
             v_deptno dept.deptno%type := 50;
             v_dname dept.dname%type := 'aaaa';
             v_loc dept.loc%type := 'bj';
          begin
            insert into dept2 values (v_deptno,v_dname,v_loc);
            commit;
          end;

          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;


          DDL語句:
          begin
            execute immediate 'create table T(nnn varchar2(20) default ''aaa'')';
          end;

          --if語句:取出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;


          --循環
          declare
            i binary_integer := 1;
          begin
            loop
              dbms_output.put_line(i);
              i := i+ 1;
              exit when (i >= 11);
            end loop;
          end;

          declare
            j binary_integer := 1;
          begin
            while j< 11 loop
              dbms_output.put_line(j);
              j := j+ 1;
            end loop;
          end;

          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;


          --錯誤處理
          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
            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_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;

          主站蜘蛛池模板: 澄城县| 绥阳县| 康平县| 调兵山市| 介休市| 茶陵县| 阿克苏市| 肇源县| 和平区| 土默特右旗| 三穗县| 开江县| 宁都县| 景东| 天全县| 浦城县| 锡林浩特市| 合肥市| 保德县| 博白县| 泽州县| 卢氏县| 吴堡县| 奉贤区| 越西县| 达拉特旗| 新安县| 雷山县| 岳普湖县| 体育| 徐州市| 霍林郭勒市| 永顺县| 西峡县| 宾川县| 湛江市| 韶关市| 乌拉特中旗| 文水县| 石河子市| 林芝县|