定义数组:
CREATE OR REPLACE
TYPE Varchar2Varray IS VARRAY(100) of VARCHAR2(40);
/定义函数:
CREATE OR REPLACE FUNCTION f_strsplit (STRING VARCHAR2, substring VARCHAR2)
RETURN varchar2varray
IS
len INTEGER := LENGTH (substring);
lastpos INTEGER := 1 - len;
pos INTEGER;
num INTEGER;
i INTEGER := 1;
ret varchar2varray := varchar2varray (NULL);
/**自定义split函数,将指定的字符串按指定的标志符分割成字符数组*/
BEGIN
LOOP
pos := INSTR (STRING, substring, lastpos + len); IF pos > 0
THEN --found
num := pos - (lastpos + len);
ELSE --not found
num := LENGTH (STRING) + 1 - (lastpos + len);
END IF; IF i > ret.LAST
THEN
ret.EXTEND;
END IF; ret (i) := SUBSTR (STRING, lastpos + len, num);
EXIT WHEN pos = 0;
lastpos := pos;
i := i + 1;
END LOOP; RETURN ret;
END;
/调试:
输入参数:'ABC$DEFGH$IJKLMN$OPQRST', '$'调试时说:ORA-00911: invalid character
继续执行,代码经过了loop - end loop里的代码,但将鼠标放到变量ret时提示:undeclared identifier 'ret',
这是怎么回事?但为什么用如下语句成功呢?
SELECT *
FROM TABLE (CAST (f_strsplit ('ABC$DEFGH$IJKLMN$OPQRST', '$') AS varchar2varray ) )
CREATE OR REPLACE
TYPE Varchar2Varray IS VARRAY(100) of VARCHAR2(40);
/定义函数:
CREATE OR REPLACE FUNCTION f_strsplit (STRING VARCHAR2, substring VARCHAR2)
RETURN varchar2varray
IS
len INTEGER := LENGTH (substring);
lastpos INTEGER := 1 - len;
pos INTEGER;
num INTEGER;
i INTEGER := 1;
ret varchar2varray := varchar2varray (NULL);
/**自定义split函数,将指定的字符串按指定的标志符分割成字符数组*/
BEGIN
LOOP
pos := INSTR (STRING, substring, lastpos + len); IF pos > 0
THEN --found
num := pos - (lastpos + len);
ELSE --not found
num := LENGTH (STRING) + 1 - (lastpos + len);
END IF; IF i > ret.LAST
THEN
ret.EXTEND;
END IF; ret (i) := SUBSTR (STRING, lastpos + len, num);
EXIT WHEN pos = 0;
lastpos := pos;
i := i + 1;
END LOOP; RETURN ret;
END;
/调试:
输入参数:'ABC$DEFGH$IJKLMN$OPQRST', '$'调试时说:ORA-00911: invalid character
继续执行,代码经过了loop - end loop里的代码,但将鼠标放到变量ret时提示:undeclared identifier 'ret',
这是怎么回事?但为什么用如下语句成功呢?
SELECT *
FROM TABLE (CAST (f_strsplit ('ABC$DEFGH$IJKLMN$OPQRST', '$') AS varchar2varray ) )
解决方案 »
- UPDATE tablename SET s="locked" WHERE s="unlocked" AND id=x;能有行锁的效果么?
- 请问 database links的密码怎么解密
- oracle简单的日期查询怎么写
- 请教数据库专家:我想深入学习数据库,数据库相关的东西包含那些 ?
- 请教这样的统计,用存储过程怎么实现
- sql语句看不懂,请大哥耐心讲解一下,谢谢了
- sql语句优化问题,现在这个sql 运行速度比较慢,怎么优化一下? 谢谢!
- 比较逊的问题,采用oracle数据库一定要安装orcle客户端运行时程序吗?
- 我在oracle官方网站下载的personal for 2000,一共有三个文件.zip,接下来我的具体步骤是什么?为什么点击setup不行:(
- 请问怎么获得连续次数呢?
- 出现错误。实在是找不到错误原因了。。请求哒人~ ~~
- oracle数据库表中某自段如何设置为自增字段呢?
必须把他转换成为可查询的类型比如表类型比如你举的例子中的CAST()函数转换类型,然后使用TABLE()函数将这个变量的值转变成表类型 使得可以进行查询-PS
实际上楼主的只需要使用TABLE()函数转换varray类型为表类型后就可以查询了
SQL> select * from table(f_strsplit('ABC$DEFGH$IJKLMN$OPQRST','$'));COLUMN_VALUE
----------------------------------------
ABC
DEFGH
IJKLMN
OPQRST
后来我只好用如下的脚本来获取分割后的数据了:FOR cur_str IN
(SELECT *
FROM TABLE
(CAST
(f_strsplit ('ABC$DEFGH$IJKLMN$OPQRST', '$') AS varchar2varray
)
))
LOOP
DBMS_OUTPUT.put_line (cur_str.column_value);
--其他操作.
END LOOP;