關於儲存過程中SQL語句IN條件傳參注意說

2021-09-02 11:50:14 字數 1327 閱讀 2494

在資料庫操作中我們經常會用到查詢語句,在一些情況下,需要使用到in條件,正常的查詢中in需要注意的是最好in中的引數不能超過1000個,超過1000的時候oracle會丟擲異常。這個如何處理先不提,這次要說的是,如果在儲存過程中使用到了in條件,而引數是由外部傳進來的情況下,需要注意一下傳參的處理方式。

正常情況下我們拼接條件會寫成,(『張三』,『李四』,『王五』),但是對於儲存過程的入參來說,這個oracle會看成乙個字串,會變成(』「張三」,「李四」,「王五」』),而到了sql語句中也就變成了:

and name in ('"張三","李四","王五"') and
所以這種方式傳進來是不符合我們的初衷的。所以我們要對引數進行乙個處理。注意到,只要把in中的條件返回乙個字串拆分後的結果集就行了,然而oracle中並沒有直接的split函式,所以我們必須想辦法自定義乙個過程或者函式來實現split(字串分割),下面看一下具體實現。

首先需要建立乙個oracle型別(type):

create or replace type strsplit_type is table of varchar2 (4000);
接下來就是實現split函式(通過管道):

create or replace function strsplit(p_value varchar2, p_split varchar2 := ',')

return strsplit_type

pipelined is

v_idx integer;

v_str varchar2(1000);

v_strs_last varchar2(4000) := p_value;

begin

loop

v_idx := instr(v_strs_last, p_split);

exit when v_idx = 0;

v_str := substr(v_strs_last, 1, v_idx - 1);

v_strs_last := substr(v_strs_last, v_idx + 1);

pipe row(v_str);

end loop;

pipe row(v_strs_last);

return;

end strsplit;

之後修改一下過程中的語句即可:

and name in(select * from table(strsplit(param)));
param引數格式為(『張三,李四,王五』),這樣傳輸即可。

儲存過程中,if語句使用

if語句 判斷使用者輸入的數字 set serveroutput on 1.提示資訊 2.接收鍵盤輸入 num 是乙個位址值 sql優化 num繫結變數 盡量使用繫結變數 select from emp where deptno 10 執行計畫 select from emp where deptn...

MySQL 儲存過程中執行動態 SQL 語句

mysql 02mysql delimiter 03mysql 04mysql createprocedureset col value 05 in tablevarchar 128 06 in columnvarchar 128 07 in new valuevarchar 1000 08 in ...

通過SQL語句提取儲存過程中的內容

首先,列出伺服器上所有資料庫。獲取資料庫列表 select name from master.dbo.sysdatabases order by name 其次,這是一種讓所有的使用者從資料庫中建立儲存過程。獲取儲存過程列表 type p 儲存過程 category 0 使用者建立的 select ...