Oracle中使用Table()函数解决For循环中不写成 in (l_idlist)形式的问题
生活随笔
收集整理的這篇文章主要介紹了
Oracle中使用Table()函数解决For循环中不写成 in (l_idlist)形式的问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在實際PL/SQL編程中,我們要對動態取出來的一組數據,進行For循環處理,其基本程序邏輯為:
?
create or replace procedure getidlist isl_idlist varchar2(200); beginl_idlist:='1,2,3,4';for brrs in (select * from bldroom where bldroomid in (l_idlist))loopbrrs.structure:='鋼混';end loop; end; / show err;1、編譯該程序,可以正常通過;
?
2、執行該程序exec getidlist,系統提示:ORA-01722: invalid number,ORA-06512: at "TT.GETIDLIST", line 6
?
解決方案:
?
CREATE OR REPLACE TYPE type_split IS TABLE OF VARCHAR2 (4000); create or replace function split(p_list varchar2,p_sep varchar2 := ',') return type_split pipelined IS l_idx pls_integer; v_list varchar2(50) := p_list; begin loop l_idx := instr(v_list,p_sep); if l_idx > 0 then pipe row(substr(v_list,1,l_idx-1)); v_list := substr(v_list,l_idx+length(p_sep)); else pipe row(v_list); exit; end if; end loop; return; end split;此時修改getidlist代碼如下:
?
?
create or replace procedure getidlist isl_idlist varchar2(200); beginl_idlist:='1,2,3,4';for brrs in (select * from bldroom where bldroomid in (select column_value from table(split(l_idlist,','))))loopbrrs.structure:='鋼混';end loop; end; / show err;?
執行:exec?getidlist;
提示錯誤:ORA-22905: cannot access rows from a non-nested table item
再次修改getidlist代碼如下:
create or replace procedure getidlist isbrRow bldroom%rowtype;l_idlist varchar2(200); beginl_idlist:='1,2,3,4';for idrs in (select column_value from table(split(l_idlist,',')))loopselect * into brRow from bldroom where bldroomid=idrs.column_value;brRow.structure:='ssss';end loop; end; / show err;
?
?
OK,搞定。
?
附:PL/SQL表---table()函數用法
摘錄
/* 利用table()函數,我們可以將PL/SQL返回的結果集代替table。 oracle內存表在查詢和報表的時候用的比較多,它的速度相對物理表要快幾十倍。 */ /* simple example: 1、table()結合數組: */create or replace type t_test as object( id integer, rq date, mc varchar2(60) );create or replace type t_test_table as table of t_test;create or replace function f_test_array(n in number default null) return t_test_table as v_test t_test_table := t_test_table(); begin for i in 1 .. nvl(n,100) loop v_test.extend(); v_test(v_test.count) := t_test(i,sysdate,'mc'||i); end loop; return v_test; end f_test_array; /select * from table(f_test_array(10));select * from the(select f_test_array(10) from dual);/* 2、table()結合PIPELINED函數: */create or replace function f_test_pipe(n in number default null) return t_test_table PIPELINED as v_test t_test_table := t_test_table(); begin for i in 1 .. nvl(n,100) loop pipe row(t_test(i,sysdate,'mc'||i)); end loop; return; end f_test_pipe; /select * from table(f_test_pipe(20));select * from the(select f_test_pipe(20) from dual);/* 3、table()結合系統包: */create table test (id varchar2(20)); insert into test values('1'); commit; explain plan for select * from test; select * from table(dbms_xplan.display);
?
關于錯誤:ORA-22905: cannot access rows from a non-nested table item 的解決方案,不知各位大俠有沒有更好的解決方案?請指教。
?
轉載于:https://www.cnblogs.com/advocate/archive/2010/08/22/1805810.html
總結
以上是生活随笔為你收集整理的Oracle中使用Table()函数解决For循环中不写成 in (l_idlist)形式的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【原】TreeView+Checkbox
- 下一篇: IE的2像素偏差问题终于“将要”成为历史