oracle儲存過程動態sql單引號拼接和變數拼接

2021-10-25 00:14:00 字數 2623 閱讀 1091

在oracle中單引號主要有兩個作用: 一是字串都用單引號引用,例如'abc';二是轉義符,轉義符在使用時一般會出現多個連在一起的單引號,相對難理解一些。下面舉例說明。

例項1:select '''' from dual; 

例項1結果:

例項2:select 'oracle''' from dual;

例項2結果:

例項1解析:第乙個和第四個單引號是成對出現的,作用是把字串引起來;第二個單引號表示轉義符號,第三個單引號表示被轉義的符號,就是此時第三個單引號在轉義符號的作用下就代表單引號「 ' 」本身。

例項2解析:'oracle'''可以拆分成4部分,①:' 、②:oracle、③:'' 、④:',其中①④成對出現,表示把中間的字串內容引起來,②表示字串:oracle,③利用轉義符將單引號本身轉義,表示單引號字串:';所以最終①④中間的字串內容是 oracle' 。

2.1拼接要點:

(1)最外邊上的兩個單引號是引用字串的固定寫法;

(2)中間兩個緊緊相連的單引號表示單引號本身(例如' '  :  第乙個單引號表是轉義字元,用來轉義後面的字元;第二個單引號是被轉義的字元,表示單引號字元本身,這裡不起到把字串引起來的作用)

2.2存過**

create   or   replace   procedure   p_test(v_djxh in number)   is

v_str varchar2(500);

v_var1 varchar2(100);

v_var2 varchar2(100);       

begin

--傳入引數  v_djxh => 12345   ,變數v_var1的值是:aed0b

select   trim(zlbscjuuid)   into  v_var1   from   tmp_dm0_fbcw_bslqc   where   djxh = v_djxh;

v_str := 'update   j1_tgq.sb_cwbb_cjtjj_zcfzb   set   uuid=''qwer''   where   zlbscjuuid =  '''||v_var1||''' ';

execute   immediate   v_str;

commit;

dbms_output.put_line('v_str:'||v_str); 

end;

列印結果:

2.3解析'update   j1_tgq.sb_cwbb_cjtjj_zcfzb   set   uuid=''qwer''   where   zlbscjuuid =  '' '   ||v_var1|| ' '' '  可以分成五部分,如下圖.

第①部分: 'update   j1_tgq.sb_cwbb_cjtjj_zcfzb   set   uuid=''qwer''   where   zlbscjuuid =  '' '  解析後為 update   j1_tgq.sb_cwbb_cjtjj_zcfzb   set   uuid='qwer'   where   zlbscjuuid =  '

第②部分: || 代表拼接符

第③部分: v_var1 代表變數 解析後為 aed0b

第④部分: || 代表拼接符

第⑤部分: ' '' '  解析後為 單引號本身'

所以五個部分拼接起來解析後的結果是: update   j1_tgq.sb_cwbb_cjtjj_zcfzb   set   uuid='qwer'   where   zlbscjuuid =  'aed0b'

下面是儲存過程中的一段**:

ls_sql := 'select  listagg(''''''''||gb_dm||'''''' as col_''||gb_dm,'','') within group (order by gb_dm) from (select distinct gb_dm from v_dm2_gjs_sds_fjm_gb_hh45_10)';

dbms_output.put_line(ls_sql);   --列印變數ls_sql的值

①:ls_sql的列印結果:  select  listagg(''''||gb_dm||''' as  col_'||gb_dm,',') within group (order by gb_dm) from (select distinct gb_dm from v_dm2_gjs_sds_fjm_gb_hh45_10)

②:plsql視窗執行①的結果 :  '270'  as  col_270, '275'  as  col_275, '276'  as  col_276, '288'  as  col_288, '328'  as  col_328, 'qt'  as  col_qt

oracle 儲存過程 呼叫動態sql

開始時間拼接 00 00 00 v sql select decode length v end 10,concat v end 00 00 00 v end from dual execute immediate v sql 編譯成功,但是儲存過程呼叫失敗。在oracl資料庫中,ddl表示資料庫定...

oracle 儲存過程 呼叫動態sql

開始時間拼接 00 00 00 v sql select decode length v end 10,concat v end 00 00 00 v end from dual execute immediate v sql 編譯成功,但是儲存過程呼叫失敗。在oracl資料庫中,ddl表示資料庫定...

oracle 動態儲存過程

1.定時 begin sys.dbms scheduler.create job job name job pro his delete cp job type stored procedure job action pro his delete cp start date sysdate,repe...