日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Oracle中使用Table()函数解决For循环中不写成 in (l_idlist)形式的问题

發布時間:2024/6/5 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)形式的问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。