oracle delimiter
时间: 2023-06-03 21:01:35 浏览: 325
Oracle的分隔符是一个特殊的字符,通常用于将一条SQL语句中的多个语句区分开来。在Oracle中,默认的分隔符是分号(;),可以通过修改会话的NLS参数来更改分隔符。例如,可以使用“set sqldelimiter”命令来将分隔符修改为其他字符,例如“/”或“#”。
相关问题
delimiter在Oracle用法
delimiter 在 Oracle 中并不是一个关键字或内置函数,因此在 Oracle 数据库中使用 delimiter 并不像在 MySQL 中那样作为一个语句分隔符来使用。在 Oracle 中,通常使用斜杠(/)来执行 SQL*Plus 中的脚本,而在 PL/SQL 程序块中,使用分号(;)作为语句的结束标志。
如果你是在 MySQL 的语境下询问关于 delimiter 的用法,那么在 MySQL 中,delimiter 可以用来改变 SQL 语句的结束符。在默认情况下,MySQL 的 SQL 语句结束符是分号(;)。但在定义存储过程、函数、触发器或事件时,由于这些对象的定义中可能包含多个语句,这时就需要使用 delimiter 来改变默认的语句结束符,使得整个对象定义被视为一个单独的单元。比如,你可能会看到如下用法:
```
DELIMITER $$
CREATE PROCEDURE YourProcedure()
BEGIN
-- 你的存储过程代码
END$$
DELIMITER ;
```
在这个例子中,我们把默认的语句结束符从分号(;)临时改变为了两个美元符号($$),这样在存储过程 `YourProcedure` 中可以包含多个分号而不会导致存储过程的提前结束。当存储过程定义完成并结束时,我们再次将 delimiter 改回分号(;)。
delimiter $$ CREATE FUNCTION `getChildidList`(rootId varchar(38)) RETURNS text DETERMINISTIC BEGIN DECLARE sTemp text; DECLARE sTempChd text; SET@@group_concat_max_len = 102400; SET sTemp = '$'; SET sTempChd = rootId; WHILE sTempChd IS NOT NULL DO SET sTemp = concat(sTemp, ',', sTempChd); SELECT group_concat(ORGA001) INTO sTempChd FROM hrsw_t_organ WHERE FIND_IN_SET(ORGA002, sTempChd) > 0; END WHILE; SET@@group_concat_max_len = 1024; RETURN SUBSTRING(sTemp,3); END; $$ 使用Oracle重写,Oracle版本为12c
对于这个MySQL函数,可以使用以下语句在Oracle 12c中进行重写:
CREATE OR REPLACE FUNCTION getChildidList(rootId VARCHAR2)
RETURN VARCHAR2
DETERMINISTIC
IS
sTemp VARCHAR2(32767);
sTempChd VARCHAR2(32767);
BEGIN
sTemp := '$';
sTempChd := rootId;
WHILE sTempChd IS NOT NULL LOOP
sTemp := sTemp || ',' || sTempChd;
SELECT LISTAGG(ORGA001, ',') WITHIN GROUP (ORDER BY ORGA001) INTO sTempChd
FROM hrsw_t_organ
WHERE REGEXP_LIKE(sTempChd, '(^|,)'|| ORGA002 ||'(,|$)');
END LOOP;
RETURN SUBSTR(sTemp, 3);
END;
/
需要注意的是,Oracle没有像MySQL一样的group_concat函数,可以使用LISTAGG函数来代替。同时,Oracle中没有FIND_IN_SET函数,可以使用正则表达式来实现类似的功能。在上面的代码中,使用REGEXP_LIKE函数来判断sTempChd是否包含ORGA002。
阅读全文