Oracle 集合转字符,PL/SQL Challenge 每日一题:2014-5-30 将逗号隔开的字符串转换为集合...

最先答对且答案未经编辑的puber将获得纪念章一枚(答案不可编辑但可发新贴补充或纠正),其他会员如果提供有价值的分析、讨论也可获得纪念章一枚。

以往旧题索引:

http://www.itpub.net/forum.php?m ... eid&typeid=1808

原始出处:

http://www.plsqlchallenge.com/

作者:Steven Feuerstein

运行环境:SQLPLUS, SERVEROUTPUT已打开

注:本题给出答案时候要求给予简要说明才能得到奖品

哪些选项在执行之后会显示如下的单词:

negative

zero

positive

(A)

CREATE OR REPLACE TYPE plch_str_tab IS TABLE OF VARCHAR2(100);

/

CREATE OR REPLACE FUNCTION plch_get_values(p_str IN VARCHAR2)

RETURN plch_str_tab

AS

l_tab plch_str_tab := plch_str_tab();

l_cnt PLS_INTEGER := 1;

l_stmt VARCHAR2(32767);

BEGIN

LOOP

l_stmt := REGEXP_SUBSTR(p_str, '[^,]+', 1, l_cnt);

EXIT WHEN l_stmt IS NULL;

l_tab.EXTEND;

l_tab(l_tab.LAST) := l_stmt;

l_cnt := l_cnt + 1;

END LOOP;

RETURN l_tab;

END plch_get_values;

/

SELECT *

FROM TABLE(plch_get_values('negative,zero,positive'))

/

(B)

WITH my_tab

AS (    SELECT TRIM (SUBSTR (txt,

INSTR (txt,

',',

1,

LEVEL)

+ 1,

INSTR (txt,

',',

1,

LEVEL + 1)

- INSTR (txt,

',',

1,

LEVEL)

- 1))

AS token

FROM (SELECT ',negative,zero,positive,' txt FROM DUAL)

CONNECT BY LEVEL <=

LENGTH ('negative,zero,positive')

- LENGTH (

REPLACE ('negative,zero,positive',

',',

''))

+ 1)

SELECT *

FROM my_tab

/

(C)

DECLARE

l_list      VARCHAR2 (1000) := 'negative,zero,positive';

l_cnt       BINARY_INTEGER;

l_tab_str   DBMS_UTILITY.uncl_array;

BEGIN

DBMS_UTILITY.comma_to_table (l_list, l_cnt, l_tab_str);

FOR indx IN 1 .. l_tab_str.COUNT-1

LOOP

DBMS_OUTPUT.put_line (TRIM (l_tab_str (indx)));

END LOOP;

END;

/

(D)

WITH original_table

AS (SELECT 'negative,zero,positive' val FROM dual)

SELECT new_val

FROM original_table,

XMLTABLE (

'r/c'

PASSING xmltype (

''

|| REPLACE(val, ',', '')

|| '')

COLUMNS new_val VARCHAR2(50) PATH '.')

/

(E)

WITH original_table

AS (SELECT 'negative,zero,positive' val FROM DUAL)

SELECT t.COLUMN_VALUE

FROM original_table,

XMLTABLE (regexp_replace(val, '([^,]+)', '"\1"')) t

/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值