oracle如何把得到的值作為引數傳入到 sql中

2021-07-02 20:45:00 字數 2890 閱讀 4101

報錯

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....