|
|
|
 |
 |
Исходник |
 |
|
 |
 |
|
Автор:
|
|
|
Название:
|
Функция грамотного разбиения sString по i символов на SQL 2000 и Oracle 9. |
|
Дата:
|
08 September 2005 |
|
Описание: |
Длинные строки разбиваются на более короткие по i символов. Причём после отсчёта i символов ищется первый пробел и только после этого добавляется разделитель '\n', что позволяет оставить слова неразбитыми. |
| |
Разместить ссылку на этот исходник в форуме вы можете вставив в текст сообщения
следующую строку:
[CODEPOST ID=160]Функция грамотного разбиения sString по i символов на SQL 2000 и Oracle 9.[/CODEPOST] |
| Оценить: |
|
1 -- SQL 2000
2 CREATE FUNCTION dbo.divide_string (@sString nvarchar(4000),@i int)
3 RETURNS nvarchar(4000) AS
4 BEGIN
5 -- var
6 DECLARE @sOut nvarchar(4000),@iNum int,@j int,@iLenO int,@iLenS int,@k int,@kk int,@iS int
7 -- end var
8 SET @sString=IsNull(@sString,'')
9 SET @i=IsNull(@i,0)
10 SET @iLenS=Len(@sString)
11 IF @iLenS<=0 OR @i<=0 OR @iLenS<@i RETURN @sString
12 SET @sOut=''
13 SET @iNum=Ceiling(Len(@sString)/@i)
14 IF @iNum*@i<@iLenS SET @iNum=@iNum+1
15 SET @k=Ceiling(@iLenS/@iNum)
16 IF @k*@iNum<@iLenS SET @k=@k+1
17 SET @j=0
18 SET @iS=0
19 WHILE Len(@sOut)-@j<@iLenS AND @j<100
20 BEGIN
21 SET @kk=@k
22 WHILE Len(@sOut)+@kk-@j<@iLenS
23 BEGIN
24 IF Substring(@sString,Len(@sOut)+@kk-@j,1)<>' ' SET @kk=@kk+1
25 ELSE BREAK
26 END
27 IF @j=0
28 SET @sOut=@sOut+Substring(@sString,1,@kk)+'\n'
29 ELSE
30 SET @sOut=@sOut+Substring(@sString,Len(@sOut)+1-@j,@kk)+'\n'
31 SET @j=@j+2
32 END
33 SET @sOut=Substring(@sOut,1,Len(@sOut)-2)
34 RETURN @sOut
35 END
36 -- Oracle 9
37 CREATE OR REPLACE FUNCTION divide_string (sString IN varchar2,i IN NUMBER)
38 RETURN VARCHAR2 IS
39 sRes VARCHAR2(4000) := sString;
40 sOut varchar2(4000) := NULL;
41 iLenS PLS_INTEGER;--длина строки
42 iNum PLS_INTEGER;--число разбиений
43 k PLS_INTEGER;--по скольку символов
44 j PLS_INTEGER;
45 BEGIN
46 IF sString IS NOT NULL AND i > 2 AND LENGTH(sString) > i THEN
47 iLenS := LENGTH(sString);--Длина строки (60)
48 iNum := Ceil(iLenS/i);--Число разбиений (при i=40: 2)
49 k := Ceil(iLenS/iNum);--По скольку символов (30)
50 WHILE sRes IS NOT NULL LOOP
51 j := INSTR(sRes, ' ', k);
52 IF j > 0 THEN
53 sOut := sOut || SUBSTR (sRes, 1, j-1) || '\n';
54 sRes := SUBSTR(sRes, j+1);
55 ELSE
56 sOut := sOut || sRes;
57 sRes := NULL;
58 END IF;
59 END LOOP;
60 ELSE
61 RETURN sString;
62 END IF;
63 RETURN sOut;
64 END divide_string;
65 |
| Вернуться к списку исходников в категории ADO.NET |
|
|
 |
 |
 |
 |
|
|