解决方案 »
- 怎么在ORACLE 上创建一个用户 权限要求:只有创建用户 删除用户的权限,没有其他权限
- oralce 随机生成一万个四位随机数(唯一)
- oracle怎么用sql语句把5000(integer)显示成5000.00
- 怎么把几个表的 colum 合成 到另一个表
- 求教一个oracle查询的问题如何取满足x0001-x0010之间的数据
- 怎样保证insert的记录在表的最后面?而不是插在空闲的rowid里面?
- 着急的很
- 如何删除表中重复的记录??
- 请问linux下有root的口令和启动oracle9的权限,但是忘记了oracle的用户名和口令怎么办?
- 我的远程数据link出错!! 如何把一个数据库中的部分记录通过sql语句导入到另一个数据库??
- oracle12c 64位安装客户端问题
- oracle原始数据(dbf)如何迁移到新环境
select REGEXP_SUBSTR(str, '[^,]+', 1, LEVEL) STR
from (select '1,2,3,4,5,6,7' str from dual)
CONNECT BY LEVEL <= REGEXP_COUNT(str, ',') + 1;
--REGEXP_COUNT 函数11g之后可用,之前版本这样写
select REGEXP_SUBSTR(str, '[^,]+', 1, LEVEL) STR
from (select '1,2,3,4,5,6,7' str from dual)
CONNECT BY LEVEL <= length(str)-length(replace(str, ',','')) + 1;执行结果如下
STR
1
2
3
4
5
6
7
非常感谢,原来如此。
在Oracle里是如何拼接 SQL然后执行的啊 ……
BEGIN
IF NVL (vUserId, 0) = 0 OR NVL (vMessageId, 0) = 0 THEN
oResInt := 0;
oResStr := '传入参数不正确!';
ELSE
SELECT COUNT (1)
INTO i
FROM tb_message
WHERE id = vMessageId;
IF i = 0 THEN
oResInt := 0;
oResStr := '记录不存在';
ELSE
INSERT INTO tb_message_readlog (id,messageid,userid,readtime)
SELECT id,messageid,userid,readtime
FROM(select fn_gen_getid ('tb_readlog') ID,
REGEXP_SUBSTR(vMessageId, '[^,]+', 1, LEVEL) MessageId ,
vUserId USERID,
SYSDATE READTIME
from dual
CONNECT BY LEVEL <= length(vMessageId)-length(replace(vMessageId, ',','')) + 1) A
WHERE EXISTS (SELECT 1
FROM tb_message_readlog
WHERE messageid = A.MessageId AND userid = A.UserId);
COMMIT;
oResInt := 1;
oResStr := '创建成功';
END IF;
END IF;
EXCEPTION
WHEN OTHERS THEN
-- Consider logging the error and then re-raise
oResInt := 0;
oResStr := '系统异常,请重试!';
RAISE;
END PR_READLOG_ADD;
自定义split,可以使用管道函数实现。你百度下就知道了。
CREATE OR REPLACE FUNCTION split (
p_str IN VARCHAR2,
p_delimiter IN VARCHAR2 default(',') --分隔符,默认逗号
)
RETURN split_type
IS
j INT := 0;
i INT := 1;
len INT := 0;
len1 INT := 0;
str VARCHAR2 (4000);
my_split split_type := split_type ();
BEGIN
len := LENGTH (p_str);
len1 := LENGTH (p_delimiter); WHILE j < len
LOOP
j := INSTR (p_str, p_delimiter, i); IF j = 0
THEN
j := len;
str := SUBSTR (p_str, i);
my_split.EXTEND;
my_split (my_split.COUNT) := str; IF i >= len
THEN
EXIT;
END IF;
ELSE
str := SUBSTR (p_str, i, j - i);
i := j + len1;
my_split.EXTEND;
my_split (my_split.COUNT) := str;
END IF;
END LOOP; RETURN my_split;
END split;