亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > Oracle > 正文

我的oracle筆記二(pl/sql 編程方面)

2024-08-29 13:49:40
字體:
來源:轉載
供稿:網友
二.pl/sql 編程方面
1.自治事務:8i以上版本,不影響主事務。
在存儲過程的is/as
后面聲明PRAGMA AUTONOMOUS_TRANSACTION;
自治事務防止嵌套提交,使事務在自己的事務區內提交或回滾不會影響其他的事務。2、包
   包說明(package specification),包頭,存放關于包的內容的信息,定義包的用戶可見的過程、
   函數,數據類型和變量
     create or replace package  tt_aa  as
        v1  varchar2(10);
        v2  varchar2(10);
        v3  number;
        v4  boolean;
        procedure proc1(x  number);
        procedure proc2(y varchar2);
        procedure proc3(z  number);
        function my_add(x number,y number) return number;
      end;
   包主體(package body)是可選的
     create or replace package  body  tt_aa as
       procedure proc1(x number) as
         begin
           v1:=to_char(x);
         end;
       procedure proc2(y varchar2) as
         begin
           v2:=y;
         end;
       procedure proc3(z number) as
         begin
           v1:=z;
         end;
       procedure proc4(x number,y number) return number as
         begin
           return x+y;
         end;
     end;
    
   調用
     begin 
         tt_aa.proc1(6);
         dbms_output.put_line(to_char(tt_aa.my_add(1,3));
     end;3、動態sql(使用dbms_sql)
    create or replace procedure my_execute(sql_string in varchar2) as
      v_cursor  number;
      v_numrows  interger;
    begin
       v_cursor:=dbms_sql.open_cursor;

       dbms_sql.parse(v_cursor,sql_string,dbms_sql.v7);
       v_numrows:=dbms_sql.execute(v_cursor);
       dbms_sql.close_cursor(v_cursor);
    end;
    
    則可以
     sql>exec  my_execute('select * from tab');
     sql>exec  my_execute('insert into test value''(''''ddd'''')');
     sql>exec  my_execute('commit');
    
  對于查詢方面的可以如下方式:
  比如想用游標查詢一個表,但是這個表是分月的,每個月可能表名都會改變。
  create or replace procedure proc_test as
    v_curid  integer;
    v_result integer;
    v_strSql varchar2(255);
    v_userid okcai.userid%type;
    v_username okcai.username%type;
  begin
     v_strSql := 'select * from okcai_'to_char(sysdate,'yyyymm');
     v_curid := dbms_sql.open_cursor;
     dbms_sql.parse(v_curid,v_strSql,dbms_sql.v7);
     dbms_sql.define_column(v_curid,1,v_userid);
     dbms_sql.define_column(v_curid,2,v_username,10);  --必須指定大小
     v_result := dbms_sql.execute(v_curid);
     loop
        if dbms_sql.fetch_rows(v_curid) = 0 then
            exit; --沒有了 ,退出循環
        end if;
        dbms_sql.column_value(v_curid,1,v_userid);
        dbms_sql.column_value(v_curid,2,v_username);
        dbms_output.put_line(v_userid);
        dbms_output.put_line(v_username);
     end loop;
     dbms_sql.close(v_curid);
  end;4、用EXECUTE IMMEDIATE
    <1>. 在PL/SQL運行DDL語句
    begin
      execute immediate 'set role all';
    end;
    <2>. 給動態語句傳值(USING 子句)
    declare
       l_depnam varchar2(20) := 'testing';
       l_loc    varchar2(10) := 'Dubai';
    begin
      execute immediate 'insert into dept values  (:1, :2, :3)'
              using 50, l_depnam, l_loc;
      commit;
    end;
   <3>. 從動態語句檢索值(INTO子句)
   declare
      l_cnt    varchar2(20);

   begin
      execute immediate 'select count(1) from emp'
          into l_cnt;
      dbms_output.put_line(l_cnt);
  end;
   <4>. 動態調用例程.例程中用到的綁定變量參數必須指定參數類型.黓認為IN類型,其它類型必須顯式指定
 declare
    l_routin   varchar2(100) := 'gen2161.get_rowcnt';
  l_tblnam   varchar2(20) := 'emp';
    l_cnt      number;
    l_status   varchar2(200);
 begin
    execute immediate 'begin ' l_routin '(:2, :3, :4); end;'
       using in l_tblnam, out l_cnt, in out l_status;    if l_status != 'OK' then
        dbms_output.put_line('error');
    end if;
 end;
   <5>. 將返回值傳遞到PL/SQL記錄類型;同樣也可用%rowtype變量
  declare
    type empdtlrec is record (empno  number(4),
                           ename  varchar2(20),
                           deptno  number(2));
    empdtl empdtlrec;
  begin
    execute immediate 'select empno, ename, deptno '
                   'from emp where empno = 7934'
      into empdtl;
  end;
   <6>. 傳遞并檢索值.INTO子句用在USING子句前
  declare
    l_dept    pls_integer := 20;
    l_nam     varchar2(20);
    l_loc     varchar2(20);
  begin
  execute immediate 'select dname, loc from dept where deptno = :1'
       into l_nam, l_loc
       using l_dept ;
  end;
   <7>. 多行查詢選項.對此選項用insert語句填充臨時表,用臨時表進行進一步的處理,也可以用REF cursors糾正此缺憾.
  declare
    l_sal   pls_integer := 2000;
  begin
    execute immediate 'insert into temp(empno, ename) '
                   '          select empno, ename from emp '
                   '          where  sal > :1'
      using l_sal;

    commit;
  end;
   <8>. 完成update的returning功能
       update可以用returning返回修改以后的值。比如:
  UPDATE employees
   SET job_id =’SA_MAN’, salary = salary + 1000, department_id = 140
   WHERE last_name = ’Jones’
    RETURNING salary*0.25, last_name, department_id
     INTO :bnd1, :bnd2, :bnd3;
       用execute immediate來完成的時候,可以用
  declare
    l_sal   pls_integer;
  begin
    execute immediate 'update employees SET salary = salary + 1000 where last_name=''okcai'' RETURNING INTO :1'
   returning into v_sql;
    commit;
  end;
 
     
5、用ref cursor來完成動態游標的功能
declare
 type ct is ref cursor;
 cc ct;
 v_notify acc_woff_notify%rowtype;
begin
 open cc for 'select * from acc_woff_notify';
 loop
  fetch cc into v_notify;
  exit when cc%notfound;
  dbms_output.put_line(v_notify.done_code);
 end loop;
 close cc;
end; 
      
6、重新編譯
    對失效的過程
    sql>exec  dbms_utility.compile_schema(schema);
    如:
    sql>exec  dbms_utility.compile_schema(scott);7.存儲過程使用table類型
<1>.字符串數組
declare
 type regionType is table of varchar2(3) index by binary_integer;
 v_listRegion regionType;
 i number(2):=0;
begin
 v_listRegion(1):='571';
 v_listRegion(2):='572';
 v_listRegion(3):='573';
 v_listRegion(4):='574';
 v_listRegion(5):='575';
 v_listRegion(6):='576';
 v_listRegion(7):=null;
 i := 1;
 while i<= v_listRegion.last loop
  dbms_output.put_line( v_listRegion(i) );
  i := v_listRegion.next(i);
 end loop;
end;<2>.rowtype數組
declare
 type CmUserType is table of cm_user%rowtype index by binary_integer;
 v_listUser CmUserType;
 i number(5):=0;
 r_user cm_user%rowtype;
begin
 
 i := 1;
 for r_user in (select * from cm_user where rownum<=5) loop
  v_listUser(i):= r_user;
  i := i + 1;
 end loop;
 
 i := 1;
 while i<= v_listUser.last loop
  dbms_output.put_line( v_listUser(i).bill_id );
  i := v_listUser.next(i);
 end loop;
end;<3>. record數組
declare
 type recCmUserType is record  (bill_id cm_user.bill_id%type,cust_name varchar2(25));
 type CmUserType is table of recCmUserType index by binary_integer;
 v_listUser CmUserType;

 i number(5):=0;
 r_user cm_user%rowtype;
begin
 
 i := 1;
 for r_user in (select * from cm_user where rownum<=5) loop
  v_listUser(i).bill_id:= r_user.bill_id;
  v_listUser(i).cust_name:= '客戶'i;
  i := i + 1;
 end loop;
 
 i := 1;
 while i<= v_listUser.last loop
  dbms_output.put_line( v_listUser(i).bill_id );
  dbms_output.put_line( v_listUser(i).cust_name );
  i := v_listUser.next(i);
 end loop;
end;8、存儲函數和過程
   
     查看函數和過程的狀態
     SQL>select object_name,status from user_objects where object_type='FUNCTION';
     SQL>select object_name,status from user_objects where object_type='PROCEDURE';
     
     查看函數和過程的源代碼
        SQL>set long 1000
        SQL>set pagesize 0
 SQL>set trimspool on
     SQL>select text from all_source where owner=user and name=upper('&plsql_name');
     
9、觸發器
   
     查看觸發器     set long 50000;
     set heading off;
     set pagesize 2000;     select
     'create or replace trigger "'
              trigger_name '"' chr(10)
      decode( substr( trigger_type, 1, 1 ),
              'A', 'AFTER', 'B', 'BEFORE', 'I', 'INSTEAD OF' )
                   chr(10)
      triggering_event chr(10)
      'ON "' table_owner '"."'
            table_name '"' chr(10)
      decode( instr( trigger_type, 'EACH ROW' ), 0, null,
                 'FOR EACH ROW' ) chr(10) ,
      trigger_body
     from user_triggers;10. 加密Oracle的存儲過程
用wrap命令,如:
    下列存儲過程內容放在AA.SQL文件中
    create or replace procedure testCCB(i in number) as
    begin
    dbms_output.put_line('輸入參數是'to_char(i));
    end;    SQL>wrap iname=a.sql;

    PL/SQL Wrapper: Release 8.1.7.0.0 - ProdUCtion on Tue Nov 27 22:26:48 2001
    Copyright (c) Oracle Corporation 1993, 2000.  All Rights Reserved.
    Processing a.sql to a.plb
    提示a.sql轉換為a.plb,這就是加密了的腳本,執行a.plb即可生成加密了的存儲過程
    運行a.plb
    SQL> @a.plb ;11.怎么樣利用游標更新數據
cursor c1 is
select * from tablename
    where name is null for update [of column]
...
update tablename set column = ...
where current of c1;但是假如這種方式打開以后做了commit,則下次fetch會報ora-01002錯誤12.怎樣自定義異常
pragma_exception_init(exception_name,error_number);
假如立即拋出異常
raise_application_error(error_number,error_msg,truefalse);
其中number從-20000到-20999,錯誤信息最大2048B
異常變量
SQLCODE 錯誤代碼
SQLERRM 錯誤信息13.在pl/sql中執行DDL語句
<1>、8i以下版本dbms_sql包
<2>、8i以上版本還可以用
execute immediate sql;
dbms_utility.exec_ddl_statement('sql');14.用java寫存儲過程包
<1>
create or replace and compile
java source
named "CHelloWorld" as
public class HelloWorld
{
  public static String print()
  {
         return System.out.println("Hello,World");
  }
};
/
<2>
create or replace function my_helloWorld return varchar2
as language java
name 'HelloWorld.print() return java.lang.String';
/<3>
select my_helloWorld from dual;


上一篇:我的oracle筆記一(sql語句方面)

下一篇:我的oracle筆記三(系統函數和系統包使用方面)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲一区二区久久久久久久| 久久久亚洲精品视频| 日韩电影中文字幕在线| 超碰日本道色综合久久综合| 亚洲欧洲日韩国产| 国产一区二区三区久久精品| 91精品久久久久久久| 黄色成人av网| 日韩第一页在线| 中文字幕日韩精品有码视频| 国产成人黄色av| 成人激情视频在线| 中文字幕综合一区| 国产中文字幕日韩| 日韩精品中文字| 久久不射热爱视频精品| 久久久久久国产精品美女| 成人精品视频99在线观看免费| 久久久人成影片一区二区三区| 国自在线精品视频| 日韩中文字幕视频在线| 欧美成人激情图片网| 久久电影一区二区| 日韩网站在线观看| www.日本久久久久com.| 色悠久久久久综合先锋影音下载| 欧美亚洲另类在线| 国产美女久久精品| 国产欧美日韩中文| 青草青草久热精品视频在线观看| 欧美激情乱人伦一区| 少妇高潮 亚洲精品| 欧美一区视频在线| 精品久久久久久国产91| 国产精品入口福利| 亚洲欧美中文字幕| 黑人巨大精品欧美一区二区| 亚洲性生活视频在线观看| 成人av番号网| 日韩美女免费观看| 亚洲电影中文字幕| 91色精品视频在线| 成人美女av在线直播| 国产精品久久久久久久久久尿| 91精品国产91久久久久| 国产一区二区三区在线免费观看| 欧美美女操人视频| 欧美黑人国产人伦爽爽爽| 国产精品老女人视频| 国产精品99导航| 欧美日韩在线视频首页| 久久的精品视频| 欧美性猛交xxxxx免费看| 欧美老妇交乱视频| 欧美肥老妇视频| 一区二区福利视频| 国产精品露脸av在线| 精品一区精品二区| 亚洲天堂影视av| 日韩中文字幕国产| 亚洲国产毛片完整版| 91性高湖久久久久久久久_久久99| 亚洲国产三级网| 亚洲欧美一区二区三区情侣bbw| 日韩成人黄色av| 欧美精品videosex极品1| 欧美乱人伦中文字幕在线| 91精品国产91久久久久福利| 7m第一福利500精品视频| 亚洲欧美成人一区二区在线电影| 成人久久久久久久| 国产精品视频26uuu| 中文国产成人精品| 亚洲的天堂在线中文字幕| 国产美女91呻吟求| 欧美激情视频一区| 精品调教chinesegay| 久久久久久久久国产精品| 久久久噜噜噜久噜久久| 久久久久久久久久国产精品| 色综合久久久888| 日本老师69xxx| 国内精品国产三级国产在线专| 久久视频在线视频| 日韩av在线网| 中文字幕日韩专区| 亚洲国产私拍精品国模在线观看| 91精品国产高清久久久久久| 国产精品久久久久久久一区探花| 国产精品一区久久久| 91在线观看免费观看| 欧美日韩一区二区在线| 成人免费看片视频| 丝袜亚洲欧美日韩综合| 国产精品免费一区豆花| 国产精品免费电影| 九九热最新视频//这里只有精品| 国产日韩欧美日韩| 成人亲热视频网站| 国产精品久久久久久久美男| 疯狂做受xxxx欧美肥白少妇| 日韩欧美亚洲一二三区| 91精品国产沙发| 色爱av美腿丝袜综合粉嫩av| 久久精品一区中文字幕| 日韩欧美国产高清91| 日av在线播放中文不卡| 亚洲精品av在线播放| 另类少妇人与禽zozz0性伦| 欧美国产高跟鞋裸体秀xxxhd| 国产精品视频播放| 高清亚洲成在人网站天堂| 久久久在线观看| 久久国内精品一国内精品| 亚洲老头老太hd| 色午夜这里只有精品| 国产精品无av码在线观看| 91国内免费在线视频| 国产精品欧美亚洲777777| 国产一区二区三区直播精品电影| 欧美电影院免费观看| 亚洲国产精品电影| 亚洲影院高清在线| 九色成人免费视频| 欧美激情综合色综合啪啪五月| 国产成人亚洲综合91精品| 成人欧美一区二区三区黑人| 精品少妇一区二区30p| 亚洲天堂开心观看| 色视频www在线播放国产成人| 亚洲自拍小视频| 国产精品美女免费| 亚洲激情视频在线播放| 国产精品最新在线观看| 91精品久久久久久久久久入口| 国产有码在线一区二区视频| 久久久久久噜噜噜久久久精品| 91成人在线播放| 色在人av网站天堂精品| 日韩在线观看你懂的| 欧美大人香蕉在线| 久久999免费视频| 日韩av在线导航| 日韩一级裸体免费视频| 国产精品第七十二页| 国产亚洲激情视频在线| 久久99青青精品免费观看| 日韩在线视频线视频免费网站| 欧美日韩国产一中文字不卡| 亚洲伊人久久综合| 一区二区三区四区在线观看视频| 亚洲va欧美va在线观看| 在线精品国产成人综合| 欧美激情xxxxx| 最新国产精品拍自在线播放| 欧美精品激情在线观看| 97在线观看免费| 国产精品69精品一区二区三区| 国产大片精品免费永久看nba| 亚洲一级片在线看| 亚洲精品福利在线| 亚洲社区在线观看| 国产精品99久久99久久久二8| 欧美一区二区大胆人体摄影专业网站|