oracle-遊標-預存程序-函數-包

來源:互聯網
上載者:User

標籤:package   count   in out   immediate   upd   tab   返回結果   執行函數   pre   

一、預存程序不可以在insert,update,delete中直接使用,可以有return但代表的是退出過程過程有三種類型:不傳回值,可以返回多個值,參數有三種類型,分別如下:        in:只輸入,不返回結果,預設為in        out:只返回結果,不輸入,要想取出輸出變數的值必須通過pl/sql塊的變數取出        in  out:可輸入,又可返回結果,要想取出輸出變數的值必須通過pl/sql塊的變數取出    --文法    create or replace procedure 名稱(a1 in varchar2,a2 out varchar2,a3 in out int)        as         begin        end;    --測試in        create or replace procedure getSex1(p_customerName in varchar2)        as             v_sex varchar2(20);        begin            select sex into v_sex from customer where customerName=p_customerName;            dbms_output.put_line(v_sex);        end;     --測試out      create or replace procedure getSex2(p_customerName in varchar2,p_sex out varchar2)        as         begin          select sex into p_sex from customer where customerName like p_customerName;        exception          when others then raise_application_error(-20001,‘occur error‘);        end;    --測試in out        create or replace procedure getSex3(p_param1 in out varchar2)         as         begin            select sex into p_param1 from customer where customerName=p_param1;        end;    --在pl/sql塊中執行        declare        begin              getSex1(‘a1‘);        end;    --在pl/sql塊中執行        declare            p_sex varchar2(20);        begin            getSex2(‘a1‘,p_sex);            dbms_output.put_line(p_sex);            getSex2(‘a2‘,p_sex);            dbms_output.put_line(p_sex);        end;                declare            p_sex varchar2(20);        begin            p_sex:=‘a1‘;            getSex3(p_sex);            dbms_output.put_line(p_sex);            p_sex:=‘a2‘;            getSex3(p_sex);            dbms_output.put_line(p_sex);        end;二、函數:        只能返回且必須返回一個結果,可以直接用在insert,update,delele,select中    可以有多個return;    文法:        create or replace function 函數名(p1 varchar2) return varchar2        as        begin        exception        end;    執行個體:根據姓名返回姓別        create or replace function getSex(p_customerName varchar2) return varchar2        as            v_sex customer.sex%type;        begin            select sex into v_sex from customer where customerName=p_customerName;            return v_sex;        end;執行函數:        1、在sql(sqlplus)            select getSex(customerName),sex from customer;        2、在pl/sql塊中      declare                v_sex customer.sex%type;            begin                v_sex:=getsex(‘a1‘);                dbms_output.put_line(v_sex);            end;預存程序:                  1.聲明處沒有return,可以返回多個值,用輸出變數(out,in out)返回                    return代表退出程式,不返回結果.                  2.不可以在insert,update,delete,select                    中直接使用,只能通過exec中用 函數:                  1.聲明處有return,只可以返回一個值,                    return代表返回一個值.                  2.可以在insert,update,delete,select                    中直接使用.三、觸發器set serveroutput on;create or replace trigger teacher_trigger after insert or update or delete on customer for each row begindbms_output.put_line(‘the table data already has been modified....‘);end;四、遊標        declare                    v_customer customer%rowtype;                    v_customerName customer.customerName%type;                    cursor c1(v_customerName varchar2) is select * from customer     where customerName like v_customerName;              begin                    v_customerName:=‘&aa‘;                    open c1(v_customerName);                    fetch c1 into v_customer;                    while(c1%found) loop                        dbms_output.put_line(v_customer.customerName||‘      ‘||v_customer.sex);                        fetch c1 into v_customer;                    end loop;              end;五、包包:包中可以有多個方法,包包括包聲明與包主體,包聲明中聲明的方法名,參數名,類型,個數必須與包主體的方法完全一樣。       包聲明中聲明的變數是全域變數,大家都可以用       --實現包聲明create or replace package my_p as     function getReverse(v_name varchar2) return varchar2;    procedure teacher_modify_column(teacher_id number,column_name varchar2,column_value1 number);end;create or replace package body my_pasprocedure teacher_modify_column(teacher_id number,column_name varchar2,column_value1 number)      is         v_sql varchar2(200);      begin        v_sql:=‘update teachers set  ‘||column_name||‘ =  ‘||column_value1||‘   where teachers.teacher_id =  ‘||teacher_id;        EXECUTE IMMEDIATE v_sql;    end teacher_modify_column; function getReverse(v_name varchar2) return varchar2asv_title varchar2(200);i int:=1;j int:=0;begin j:=length(v_name); while (j>0) loop v_title:= substr(v_name,i,1)||v_title; i:=i+1; j:=j-1; end loop;return v_title;end;end;      create or replace package MyPackage as           type c_type is ref cursor;           function MyReverse(source varchar2) return varchar2;           procedure splitPage(p_sql varchar2,page int,pageSize int,result out c_type,pageCount out int);       end;       --實現包主體        create or replace package body MyPackage as               function MyReverse(source varchar2) return varchar2               as                  i int;                 j int;                 result varchar2(2000):=‘‘;               begin                 j:=length(source);                 i:=1;                 while(i<=j) loop                   result:=substr(source,i,1)||result;                   i:=i+1;                 end loop;                 return result;               end;             // 查詢語句           頁數                                                                procedure splitPage(p_sql varchar2,page int,pageSize int,result out c_type,pageCount out int)               as                  v_sql varchar2(500);                 startPage int;                 endPage int;                 v_rowCount int;               begin                 v_sql:=‘select count(*) from (‘||p_sql||‘)‘;                 dbms_output.put_line(v_sql);                 execute immediate v_sql into v_rowCount;                 pageCount:=ceil(v_rowCount/pageSize);                 if(page=0) then                    raise_application_error(-20001,‘申請的頁面太小‘);                 end if;                 if(page>pageCount) then                    raise_application_error(-20001,‘申請的頁面太大‘);                 end if;                 startPage:=(page-1)*pageSize;                 endPage:=page*pageSize;                 v_sql:=‘select * from (‘||p_sql||‘) where rowNum<=‘||to_char(endPage);                  v_sql:=v_sql||‘ minus ‘;                   v_sql:=v_sql||‘select * from (‘||p_sql||‘) where rowNum<=‘||to_char(startPage);                  dbms_output.put_line(v_sql);                  open result for v_sql;              end;    end;    --調用包中的方法        select MyPackage.MyReverse(sex) from customer;    --在pl/sql塊中調用    declare      pageCount int;      c1 mypackage.c_type;      v_customer customer%rowtype;    begin      mypackage.splitPage(‘select * from customer‘,1,2,c1,pageCount);      dbms_output.put_line(‘總頁數是‘||pageCount);      fetch c1 into v_customer;      while(c1%found) loop             dbms_output.put_line(v_customer.customername||‘  ‘||v_customer.sex);             fetch c1 into v_customer;      end loop;      close c1;      mypackage.splitPage(‘select * from customer‘,2,2,c1,pageCount);      fetch c1 into v_customer;      while(c1%found) loop             dbms_output.put_line(v_customer.customername||‘  ‘||v_customer.sex);             fetch c1 into v_customer;      end loop;      close c1;      mypackage.splitPage(‘select * from customer‘,3,2,c1,pageCount);      fetch c1 into v_customer;      while(c1%found) loop             dbms_output.put_line(v_customer.customername||‘  ‘||v_customer.sex);             fetch c1 into v_customer;      end loop;      close c1;              mypackage.splitPage(‘select * from customer‘,4,2,c1,pageCount);      fetch c1 into v_customer;      while(c1%found) loop             dbms_output.put_line(v_customer.customername||‘  ‘||v_customer.sex);             fetch c1 into v_customer;      end loop;      close c1;          end;

 

oracle-遊標-預存程序-函數-包

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.