報錯
select wm_concat(job_id)-- 10g
into
v_job_id_str
from ne_job_element
where event_id is null
and ne_id = p_neid;
open cur_job for
-- execute immediate sql_str;
select j.*
from ne_job j
where j.job_id in ( v_job_id_str ) ;
loop
fetch cur_job into r_job;
exit when cur_job%notfound;
dbms_output.put_line('-----'||cur_job%rowcount );
end loop;
close cur_job;
instr (源字串, 目標字串, 起始位置, 匹配序號)
在oracle/plsql中,instr函式返回要擷取的字串在源字串中的位置。只檢索一次,就是說從字元的開始到字元的結尾就結束。
引數分析: string1 源字串,要在此字串中查詢。
string2 要在string1中查詢的字串.
start_position 代表string1 的哪個位置開始查詢。此引數可選,如果省略預設為1. 字串索引從1開始。如果此引數為正,從左到右開始檢索,如果此引數為負,從右到左檢索,返回要查詢的字串在源字串中的開始索引。
修改後:
open cur_job for
-- execute immediate sql_str;
select j.*
from ne_job j
where instr(',' || v_job_id_str || ',' , ',' || j.job_id || ',') > 0;
loop
fetch cur_job into r_job;
exit when cur_job%notfound;
dbms_output.put_line('-----'||cur_job%rowcount );
end loop;
close cur_job;
解決方法參考:
但是寫的時候遇到乙個麻煩的問題,這個where條件的引數必須是number型的,而且使用的是in,也就是多個引數,比如
select * from table_name_1 where id in (1,2,3,4,5)
,其中的1,2,3,4,5即是通過儲存過程的引數傳入的。
這裡有個問題,如果在sql中,where id in (1,2,3,4,5)這條語句會認為1,2,3,4,5是五個單獨的number型,而不會將其作為乙個字串。但是如果在儲存過程中作為乙個整體的引數進行傳入時,即會將
1,2,3,4,5
判定為'1,2,3,4,5'
,而'1,2,3,4,5'是乙個字串,這時候sql執行的實際上是
select * from table_name_1 where id in (『1,2,3,4,5』)
,而id是乙個number型的,這時候就會報錯。
原儲存過程大致如下:
create or replace procedure test_prc(an_id in number)
isbegin
insert into tmp_table
select * from table_name_1 where id in (an_id);
commit;
end;
如上述的儲存過程,由於傳入的引數an_id是乙個number型的,如果是乙個單獨的數字,過程執行沒有問題,但如果是乙個字串,如'1,2,3,4,5',這樣就會報錯,因為'1,2,3,4,5'是乙個varchar。
如果將傳入的引數an_id 改為varchar型的,如
create or replace procedure test_prc(an_id in varchar)
,這時候雖然在傳入的時候型別一致了,但是在執行select語句時——where id in (an_id),由於表table_name_1的id列是number型的, 傳入的實際上是'1,2,3,4,5',這時候,也會報錯。
這種情況據我所知可以有兩種方法來解決,第一種是使用動態sql;第二種是使用instr函式來解決。有的朋友使用的是動態sql,我沒使用這種方法,第一是自己不太會寫,第二是覺得太繁瑣。這裡重點說的是使用instr函式。以後可能也會嘗試使用動態sql來試試看,到時候再來更新吧。
其實使用instr函式也沒有什麼多說的,仔細看懂了理解了就行了,先貼出結果吧。
create or replace procedure test_prc(an_id in varchar)
isbegin
insert into tmp_table
select * from table_name_1 where instr(',' || an_id || ',' , ',' || id || ',') > 0;
commit;
end;
instr函式是個字串搜尋函式,預設情況下有兩個引數:instr(string,set),用於在string中尋找set的位置,如果找到,返回set子串的第乙個字元的位置,如果沒有找到,則返回0。
之所以在開始和結束都加上',',是為去掉當查詢11的時候,會將1和11都取出來。
至此,問題解決。
C 把引用作為返回值
返回的引用是函式裡選擇的對應變數返回的引用,return vals i 是陣列的某個元素,然後即可進行賦值 setvalues 1 20.23 記得在定義函式名前加 用引用返回乙個函式值的最大好處是,在記憶體中不產生被返回值的副本。include using namespace std double...
C 把引用作為返回值
c 把引用作為返回值 c 引用 c 引用 通過使用引用來替代指標,會使 c 程式更容易閱讀和維護。c 函式可以返回乙個引用,方式與返回乙個指標類似。當函式返回乙個引用時,則返回乙個指向返回值的隱式指標。這樣,函式就可以放在賦值語句的左邊。例如,請看下面這個簡單的程式 例項 include using...
linux下如何把apache作為服務執行?
我自己是加了兩句話就可以開機啟動的 前提是用yum 安裝 apache 其實在原始碼裡已經有啟動的指令碼,我們要修改下即可,把apache加入系統sysv服務中來。在原始碼httpd 2.x.x build rpm中存在httpd.init 長久以來linux下apache的啟動是在 etc rc....