关于解析字符串的存储过程

songziying 2011-07-20 11:47:38
表如下图

需求如下
存储过程一, 传入id参数, 返回解析后的字符串
比如传的id是2, 记录2的统计表达式是3+4, 记录3,4没有统计表达式 所以返回字符串是(3)+(4).

再比如传的id 是1, 记录1的统计表达式是2+5+10

返回解析后的字符串是((3)+(4))+(6)+(10), 因为记录2的统计表达式是3+4, 5是6, 要逐层递归, 直到本记录没有统计表达式为止

存储过程二, 解析存储过程一传回来的字符串替换其中的数字为特定格式的SQL
比如传回((3)+(4))+(6)+(10) 则最后被替换的结构是
((select en_bbalance from aa where l_item_id = 3) + (select en_bbalance from aa where l_item_id = 4))+
(select en_bbalance from aa where l_item_id = 6)+
(select en_bbalance from aa where l_item_id = 10)

烦劳各位了, 帮帮忙, 我以前没写过Oracle存储过程,多谢.



...全文
180 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
songziying 2011-07-29
  • 打赏
  • 举报
回复
谢谢,大家
jym2002 2011-07-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 songziying 的回复:]
在线等
[/Quote]
在线等什么 图片看不到 不明白说的什么
renfengjun 2011-07-20
  • 打赏
  • 举报
回复
发完帖子能不能自己看一下?
图片看不到,谁能看懂你说的是什么。
Kobayashi 2011-07-20
  • 打赏
  • 举报
回复
图片看不到。
看了半天没有看懂是什么意思。
songziying 2011-07-20
  • 打赏
  • 举报
回复
在线等
wallace_jjh 2011-07-20
  • 打赏
  • 举报
回复
SELECT ID, col1 FROM test1
---------------------------
1 2+5+10
2 3+4
5 6
**********************************************

CREATE OR REPLACE FUNCTION getLoopStr(x_id IN NUMBER) RETURN VARCHAR2
IS
vc_addFlag VARCHAR2(1) := '+';
vn_str VARCHAR2(100);
vn_str2 VARCHAR2(100);
ret_str VARCHAR2(100);
BEGIN
SELECT MAX(col1)
INTO vn_str
FROM test1
WHERE id = x_id;

IF vn_str IS NULL THEN
RETURN '(' || x_id || ')';
ELSE
vn_str2 := vn_str || vc_addFlag;
FOR i IN 0..length(vn_str) - length(REPLACE(vn_str, vc_addFlag)) LOOP

ret_str := ret_str || vc_addFlag || getLoopStr(substr(vn_str2, 1, instr(vn_str2, vc_addFlag) - 1)) ;

vn_str2 := substr(vn_str2, instr(vn_str2, vc_addFlag) + 1 );
END LOOP;
END IF;

RETURN substr(ret_str, 2);

END getLoopStr;

**********************************************
SELECT getloopstr(1), getloopstr(2) FROM dual
-------------------------------------------
(3)+(4)+(6)+(10) (3)+(4)




caoleione 2011-07-20
  • 打赏
  • 举报
回复
--取得解析SQL
CREATE OR REPLACE FUNCTION GETSQL(P_STR VARCHAR2) RETURN VARCHAR2 AS
V_STR VARCHAR2(200);
V_POS NUMBER;
V_CHAR VARCHAR2(10);
V_SQL VARCHAR2(200);
BEGIN
V_STR := REPLACE(REPLACE(P_STR,'((','('),'))',')');
V_SQL:=P_STR;
LOOP
V_POS := INSTR(V_STR, '+');
IF V_POS > 0 THEN
V_CHAR := SUBSTR(V_STR, 0, V_POS - 1);
V_STR := SUBSTR(V_STR, V_POS + 1);
ELSE
V_CHAR := V_STR;
END IF;
V_SQL:=REPLACE(V_SQL,V_CHAR,'(SELECT EN_BBALANCE FROM AA WHERE L_ITEM_ID ='||SUBSTR(V_CHAR, 2, LENGTH(V_CHAR) - 2) || ')'||')');
EXIT WHEN V_POS = 0;
END LOOP;
RETURN V_SQL;
END;
caoleione 2011-07-20
  • 打赏
  • 举报
回复
--创建函数解析表达式
CREATE OR REPLACE FUNCTION GETSTR(P_STR VARCHAR2) RETURN VARCHAR2 AS
V_STR VARCHAR2(2000);
V_POS NUMBER;
V_CHAR VARCHAR2(10);
V_LSTR VARCHAR2(2000);
BEGIN
V_STR := P_STR;
LOOP
V_POS := INSTR(V_STR, '+');
IF V_POS > 0 THEN
V_CHAR := SUBSTR(V_STR, 0, V_POS - 1);
V_STR := SUBSTR(V_STR, V_POS + 1);
ELSE
V_CHAR := V_STR;
END IF;
SELECT V_LSTR ||
NVL2(COUNTSTR,
'(' || GETSTR(COUNTSTR) || ')',
DECODE(INSTR(P_STR, '+'), 0, V_CHAR, '(' || V_CHAR || ')')) ||
DECODE(V_POS, 0, '', '+')
INTO V_LSTR
FROM TEST_A
WHERE L_ITEM_ID = V_CHAR;
EXIT WHEN V_POS = 0;
END LOOP;
RETURN V_LSTR;
END;
--取得每项已解析表达式
select getstr(COUNTSTR),COUNTSTR,L_ITEM_ID from test_a where L_ITEM_ID=1;
songziying 2011-07-20
  • 打赏
  • 举报
回复
songziying 2011-07-20
  • 打赏
  • 举报
回复
不知道这张图能否看到
songziying 2011-07-20
  • 打赏
  • 举报
回复
不好意思,我能看到图呢, 就是一个表 如下

VC_ITEM_NAME EN_BBALANCE L_ITEM_ID COUNTSTR
统计项目1 1 2+5+10
子统计项目1 2 3+4
项目1 100 3
项目2 200 4
子统计项目2 5 6
项目1 300 6
项目10 400 10

17,090

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧