oracle開發實用筆記

本博文是平時整理的筆記,比較亂,完全供自己看

1、局部事物
pragma autonomous_transaction;
procedure txn_log(p_log_text in varchar2) is
    pragma autonomous_transaction;
  begin

    if g_enable_log = c_yes then
      insert into con_import_int_err_logs
        (batch_id,
         batch_line_id,
         input_con_number,
         input_con_desc,
         message,
         message_date)
      values
        (g_batch_id,
         g_batch_line_id,
         g_input_con_number,
         g_input_con_desc,
         p_log_text,
         sysdate);
      null;
      commit;
    end if;
  end txn_log;

2、可以將整個查詢結果插入表
insert into avic_exp_req_dtl_query_r_tmp
     (session_id,
      company_id) select p_session_id, p_company_id from fnd_companies;

3、導入的時候校驗導入的一批數據
for循環這批數據,有錯誤的話就記錄錯誤日誌(局部事物)、錯誤標誌,
for循環結束後,如果錯誤標誌成立,就拋個異常
4、執行動態sql
v_sql := 'begin :1 := ' || v_proc_name || '( :2, :3, :4, :5); end;';

    execute immediate v_sql
      using out v_return, p_event.record_id, p_handle_log_id, p_event.event_param, p_event.created_by;
5、bulk collect
只適用於select into, fetch into, DML
9i之前select into 必須返回一條數據,從9i開始,可以使用bulk collect返回多行數據的結果集
declare
  type emp_table_type is table of emp&rowtype index by binary_integer;
  emp_table emp_table_type;
begin
  select * bulk collect into emp_table from emp where deptno=&no;
  for i in 1..emp_table.count loop
     dbms_output.put_line('僱員姓名:' || emp_table(i).ename);
  end loop;
end;
declare
  type ename_table_type is table of emp.ename&TYPE;
  ename_table ename_table_type;
begin
--將刪除的人員信息放入結果集中 
delete from emp where deptno=&no
     returning ename bulk collect into ename_table;

end;
6、做數據同步的時候,可以先loop,更新已經存在的數據,然後loop,插入不存在的數據,這樣子邏輯清晰,但是要loop兩次表。
7、複合變量用法
declare
--定義記錄類型
  type gr_element is record(
    emp_no   varchar2(30),
    emp_name varchar2(100)
    );
 
  type gc_element is table of gr_element index by binary_integer;
 
  --定義變量
  r_element gr_element;
  c_element gc_element;

begin
 
  --變量賦值
  r_element.emp_no   := '01';
  r_element.emp_name := '張三';
 
  dbms_output.put_line(c_element.count);
  c_element(c_element.count + 1) := r_element;
  dbms_output.put_line(c_element.count);
 
  r_element.emp_no   := '02';
  r_element.emp_name := '李四';
 
  c_element(c_element.count + 1) := r_element;
  dbms_output.put_line(c_element.count);
 
  for i in 1..c_element.count loop
    --輸出
    dbms_output.put_line(c_element(i).emp_no);
    dbms_output.put_line(c_element(i).emp_name);
  end loop;
 
end;

 

多維表類型變量
該程序定義了名爲tabletype1的多維表類型,相當於多維數組,table1是多維表類型變量,將數據表tempuser.testtable中recordnumber爲60的記錄提取出來

存放在table1中並顯示。
   ―――――――――――――――――――――――――――――――――――――
   declare
      type tabletype1 is table of testtable%rowtype index by binary_integer;
      table1 tabletype1;
   begin
       select * into table1(60) from tempuser.testtable where recordnumber=60;
       dbms_output.put_line(table1(60).recordnumber||table1(60).currentdate);
   end;
  
   備註:在定義好的表類型變量裏,可以使用count、delete、first、last、next、exists和prior等屬性進行操作,使用方法爲“表變量名.屬性”,返回的是數字。
   
   set serveroutput on
   declare
        type tabletype1 is table of varchar2(9) index by binary_integer;
        table1 tabletype1;
   begin
        table1(1):='成都市';
        table1(2):='北京市';
        table1(3):='青島市';
        dbms_output.put_line('總記錄數:'||to_char(table1.count));
        dbms_output.put_line('第一條記錄:'||table1.first);
        dbms_output.put_line('最後條記錄:'||table1.last);
        dbms_output.put_line('第二條的前一條記錄:'||table1.prior(2));
        dbms_output.put_line('第二條的後一條記錄:'||table1.next(2));
    end;
8、dbms_job
提交job,當next_date=sysdate時,submit後JOB將立即運行,相當於dbms_job.run(job => v_job_id);
dbms_job.submit(job => v_job_id, what => v_sql);
dbms_job.submit(job       => v_job_id,
                      what      => v_sql,
                      next_date => v_job_detail.next_date,
                      interval  => v_interval);
數據庫中已經存在,更新job相關參數
        dbms_job.change(job       => v_job_detail.job_id,
                        what      => v_sql,
                        next_date => v_job_detail.next_date,
                        interval  => v_interval);
dbms_job.remove(job => v_job_id);刪除
dbms_job.broken(job => v_job_id, broken => true);暫掛
dbms_job.broken(job => v_job_id, broken => false);恢復

8、動態sql
靜態sql是編寫pl/sql塊時直接嵌入的sql語句,動態sql是在運行pl/sql塊時動態輸入的sql語句

動態sql處理方法
1、execute immediate 不能用於處理多行查詢語句
2、open-for fetch close  處理多行查詢操作
3、批量動態sql
sql := 'drop table ' || p_table_name;
sql := 'grant ' || p_priv || ' to ' || p_user;
sql := 'update emp set sal = sal * 1.1 where dept_no = 30';
execute immediate sql;
sql := 'update emp set sal = sal * (1 + :percent/100)' || ' where empno= &eno returning sal into :salary';
execute immediate sql using &1, &2 returning into salary;
動態語句中使用bulk collect
sql := 'update emp set sal=sal*(1+:percent/100)' || ' where deptno="dno' || ' returning ename, sal into :name, salary';
execute immediate sql using &percent, &dno returning bulk collect into ename_table, sal_table;
sql := 'select ename from emp where deptno=:dno';
execute immediate sql bulk collect into ename_table using &dno;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章