锁定老帖子 主题:oracle嵌套表--补充(所用函数说明)
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-02-27
1、cast:强制转换成指定的数据类型。 2、multiset:转换成定义好的类型。 3、 table()函数 参考http://www.itpub.net/showthread.php?threadid=617298 PL/SQL表---table()函数用法 /*
PL/SQL表---table()函数用法: 利用table()函数,我们可以将PL/SQL返回的结果集代替table。 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(); -- append one null element -- 为增加的元素赋值,如果没用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)); /* 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)); /* 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); 4、上述所用函数解释
extend(): Oracle 在逻辑上是由各个表空间(tablespace)构成的,
tablespace由segments(段)构成 段是由extends构成 中文叫作区 或者数据区 区是由一个一个的数据块构成 数据块的大小由操作系统决定。 PIPELINED pipe row:
Pipelined Table实现split函数的示例
split作用: 比如说把一个字符串A,B,C,D,E 根据逗号分隔,转换成一个数组,数组中的每个元素是
A B C D E 在实际的应用中,为了让PL/SQL 函数返回数据的多个行,必须通过返回一个 REF CURSOR 或一个数据集合来完成。REF CURSOR 的这种情况局限于可以从查询中选择的数据,而整个集合在可以返回前,必须进行具体化。 Oracle 9i 通过引入的管道化表函数纠正了后一种情况。表函数是返回整个行的集(通常作为一个集合)的函数,可以直接从 SQL 语句中进行查询,就好像它是一个真正的数据库表一样。管道化表函数与之相似,但是它像在构建时一样返回数据,而不是一次全部返回。管道化表函数更加有效,因为数据可以尽可能快地返回。 管道化表函数必须返回一个集合。在函数中,PIPE ROW 语句被用来返回该集合的单个元素,该函数必须以一个空的 RETURN 语句结束,以表明它已经完成。一旦我们创建了上述函数,我们就可以使用 TABLE 操作符从 SQL 查询中调用它。 管道化表函数经常被用来把数据从一种类型转化成另一种类型。 下面是用Pipelined Table实现split函数的示例: CREATE OR REPLACE TYPE ty_str_split IS TABLE OF VARCHAR2 (4000); CREATE OR REPLACE FUNCTION fn_split (p_str IN VARCHAR2, p_delimiter IN VARCHAR2) WHILE j < len IF j = 0 IF i >= len RETURN;
SELECT * FROM TABLE (fn_split ('1;;12;;123;;1234;;12345', ';;'));
CREATE TYPE mytype AS OBJECT ( CREATE TYPE mytypelist AS TABLE OF mytype; CREATE OR REPLACE FUNCTION pipelineme RETURN;
SELECT * FROM TABLE (pipelineme); FIELD1 FIELD2 20 rows selected 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
浏览 3670 次