本博文是平時整理的筆記,比較亂,徹底供本身看sql
一、局部事物
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;數組
二、能夠將整個查詢結果插入表
insert into avic_exp_req_dtl_query_r_tmp
(session_id,
company_id) select p_session_id, p_company_id from fnd_companies;session
三、導入的時候校驗導入的一批數據
for循環這批數據,有錯誤的話就記錄錯誤日誌(局部事物)、錯誤標誌,
for循環結束後,若是錯誤標誌成立,就拋個異常
四、執行動態sql
v_sql := 'begin :1 := ' || v_proc_name || '( :2, :3, :4, :5); end;';ide
execute immediate v_sql
using out v_return, p_event.record_id, p_handle_log_id, p_event.event_param, p_event.created_by;
五、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;oop
end;
六、作數據同步的時候,能夠先loop,更新已經存在的數據,而後loop,插入不存在的數據,這樣子邏輯清晰,可是要loop兩次表。
七、複合變量用法
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;fetch
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的記錄提取出來server
存放在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;
八、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);恢復element
八、動態sql
靜態sql是編寫pl/sql塊時直接嵌入的sql語句,動態sql是在運行pl/sql塊時動態輸入的sql語句
動態sql處理方法 一、execute immediate 不能用於處理多行查詢語句 二、open-for fetch close 處理多行查詢操做 三、批量動態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;