plsql 學習筆記1

2021-04-14 01:10:55 字數 4852 閱讀 5994

在plsql中寫儲存過程時,需要寫 要執行的sql語句,在這個語句中變數應該這樣: '||變數||' ,成為變數的值。

如果變數需要加『』 ,那麼就得 『『『||變數||』』』。

如果變數上加兩個『』,就是這樣 '『||變數||』',那麼就變成 變數的名字,而不是變數的值。

不是變數的量,如果需要加『』,那麼這樣,『『yyyy-mm-dd』』;

一  是 關於plsql中寫在sql中的變數

不是變數的量,如果加雙『』,或者加 三個『』。系統就提示是錯誤的。

如: v_exec_sql:=v_exec_sql||' partition by range (start_time) '||

'  (partition pt'||v_num|| ' values less than (to_date('''||v_char2||''',''yyyy-mm-dd'')),';

當列印時變成:create table zhzc.sd_norate_usage_events_200706

partition by range (start_time) 

(partition pt1 values less than (to_date('2007-06-02','yyyy-mm-dd'), 

partition p40 values less than (maxvalue) )  

as  select * from sd_norate_usage_events_

同時注意:『』一般是來包括 語句的,如:v_exec_sql:='create table aa ';

而||和|| 是用來包括 變數的,也用來換行的,如: v_exec_sql := 'create table zhzc.' || v_tab_name || '_' || v_now_month || ' as  '

|| 'select * from zhzc.' || v_tab_name;  注意最後的那個變數就不用||了 。倒數第二個 || 是用來換行的。

二:建立分割槽表

create table zhzc.sd_norate_usage_events_200706

partition by range (start_time) 

( partition pt1 values less than (to_date('2007-06-02','yyyy-mm-dd'), 

partition p40 values less than (maxvalue) )  

as  select * from sd_norate_usage_events_

也可以這樣:

create table zhzc.sd_norate_usage_events_200706  (id int,start_time date)

partition by range (start_time) 

( partition pt1 values less than (to_date('2007-06-02','yyyy-mm-dd'), 

partition p40 values less than (maxvalue) )  

查詢某個分割槽時:

select *from sd_norate_usage_events_200706 partition (pt1)

三:注意 plsql中迴圈的操作

v_exec_sql:=v_exec_sql||' partition pt'||v_num||' values less than (to_date('''||v_char2||''',''yyyy-mm-dd'')),';

v_num:=v_num+1; 

exit when v_num=3;

得到create table sd_norate_  partition by range (start_ti)

(  partition pt1 values less than (to_date('2007-06-02','yyyy-mm-dd')),

partition pt2 values less than (to_date('2007-06-03','yyyy-mm-dd')),

partition p40 values less than (maxvalue) )

30時就不執行

對比:v_exec_sql:=v_exec_sql||' partition pt'||v_num||' values less than (to_date('''||v_char2||''',''yyyy-mm-dd'')),';

exit when v_num=3;

v_num:=v_num+1;  ----注意:不是v_num:=+1;

3時是否執行?

得到結果:

create table sd_norate_ 

partition pt1 values less than 

partition pt2 values less than  

partition pt3 values less than

partition p40 values less than (maxvalue) )

而:while迴圈

while i<=3 loop

v_char:=trim(to_char(i+01,'00'));

v_char2:=trim(''||v_mon||'-'||v_char||'');

bb:=bb||' partition pt'||i||' values less than ';

i:=i+1;  --不能是i:=+1;

end loop;

bb:=bb||'partition p40 values less than (maxvalue) ) ';--|| 

得到結果:

create table sd_norate_ 

partition pt1 values less than 

partition pt2 values less than

partition pt3 values less than

partition p40 values less than (maxvalue) )

五:關於plsql的if

有兩種寫法:

if() then

else

end if;

2是:if() then

elsif () then

elsif () then

end if;

六:建立表並且放在某個表空間裡

create table aa(id int ,name varchar2(10)) tablespace tbs_ind;

七:對比(plsql中的)

v_exec_sql := 'select distinct constraint_name from user_constraints where ' ||

'owner=''' || v_tab_schema || ''' and ' ||

'constraint_type=''p'' and ' ||

'table_name=''' || v_tab_name || '''';

v_exec_sql := 'select distinct index_name from all_indexes where ' ||

'owner=''' || v_tab_schema || ''' and ' ||

'table_name =''' || v_tab_name || '''';

和select count(0) into v_exist_num from all_tables t

where t.owner=v_tab_schema and t.table_name=trim(v_tab_name);  

前兩個是 需要在加  execute immediate v_exec_sql; 來執行的語句。而最後乙個是在plsql中直接就執行的語句。  

八:sybase不提供子表查詢,需要用到臨時表。而oracle提供子表查詢

sybase中的

第一步建立臨時表:

select employ, name, bz into #abc

from zhcx_bigcust_zksk b where b.bz = '1' and area_id = '05000002'

select a.employ from #abc a

第二步:聯接

select d.name, d.employ, null(c.plan_value, 0) plan_value, d.bz

from zhcx_assess_plan c right join #abc d

on c.sales_id = d.employ  and c.year_plan = 2007  

在oracle中:

select d.name, d.employ, null(c.plan_value, 0) plan_value, d.bz

from zhcx_assess_plan c right join (select employ, name, bz

from zhcx_bigcust_zksk b

where b.bz = '1'

and area_id = '05000002') d on c.sales_id =

d.employ

and c.year_plan = 2007  

九 關於rename表

是這樣: rename aa  to aa_zhang

而不是   rename zhzc.aa  to zhzc.aa_zhang 或者是rename aa  to zhzc.aa_zhang

是因為rename時不要模式名的。                 

PL SQL學習筆記

from ebs pl sql儲存過程報表輸出 1.fnd file.put line fnd file.log,l err idx 從mes表獲取tool id tool.tool id 出現異常錯誤!2.fnd file.put line fnd file.output,文字輸出內容.獲取物件結...

PL SQL學習筆記

1 啟動sqlplus crtl r sqlplus 啟動sqlplus 輸入使用者名稱密碼登陸oracle 輸出hello world!ps sql set serveroutput on 這句不寫的話不會有結果輸出 sql begin 2 dbms output.put line hello w...

oracle學習筆記 PL SQL

pl sql 它是一種過程化語言,在pl sql中可以使用if語句或是log語句,以實現控制程式的執行流程,甚至可以定義變數,以至在語句之間傳遞資料資訊,這樣pl sql語言就能夠實現操控程式處理的細節,因此使用pl sql語句可以實現比較複雜的業務邏輯,它是oracle的專用語言,它是對標準sql...