powered by simpleCommunicator - 2.0.32     © 2024 Programmizd 02
Форумы / Другие СУБД [игнор отключен] [закрыт для гостей] / Teradata , inline Function
3 сообщений из 3, страница 1 из 1
Teradata , inline Function
    #39979612
Valkar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток уважаемые знатоки.

прочитал то, что есть по терадате и не нашёл похожего.

Я написал процедуру которая парсит хитрую строку. вида
Код: sql
1.
19*2020-07-13 10:32:5919*2020-07-13 10:32:598*000-345214*Ввод атрибутов


выглядит она чуть-чуть ужасно , но работает.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
REPLACE PROCEDURE token ( str1 VARCHAR(2000) ,  pos INT) 
DYNAMIC RESULT SETS 1
BEGIN

	DECLARE tokpos INT;
	DECLARE offset INT;
	DECLARE lng INT;
	DECLARE fst_prt VARCHAR(100);
	DECLARE scnd_prt VARCHAR(500);
	SET tokpos = 1;
	SET offset = 1;
	SET fst_prt = '';
	
	DELETE FROM DBMS_OUTPUT;	
	
	  WHILE tokpos <= pos DO
		SET lng = INSTR(str1,'*',offset,1) - offset ;
		SET fst_prt = SUBSTR( str1, offset, INSTR(str1,'*',offset,1) - offset  );
		SET scnd_prt = SUBSTR( str1, offset + lng + 1 ,CAST(fst_prt AS INT ) );
		SET offset = offset + CAST(fst_prt AS INT ) + 1 + LENGTH(fst_prt) ;
		SET tokpos = tokpos+1;
	  END WHILE;
	  INSERT INTO DBMS_OUTPUT ( str,step,fst,scnd) VALUES (str1,tokpos,fst_prt,scnd_prt);

END ;
-- достать значение третьей лексемы
CALL token ('19*2020-07-13 10:32:5919*2020-07-13 10:32:598*000-345214*Ввод атрибутов',3);



собственно вопрос: Есть ли способ оформить этот код в виде функции , которую можно было бы вызвать таким образом:
Код: sql
1.
2.
3.
WITH a AS (
SELECT '19*2020-07-13 10:32:5919*2020-07-13 10:32:598*000-345214*Ввод атрибутов' AS str1)
SELECT token (a.str1,3) FROM a


и получить при этом строку с ответом "000-3452", как обычная функция в Oracle.

Если кто-нибудь знает способ, или доку где это можно прочитать, дайте знать.
...
Рейтинг: 0 / 0
Teradata , inline Function
    #39980079
Valkar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
задача решилась через рекурсивный запрос.

Функции и процедуры не понадобились.
...
Рейтинг: 0 / 0
Teradata , inline Function
    #39980081
Valkar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
WITH w_data
AS
(
     SELECT '19*2020-07-13 10:32:5919*2020-07-13 10:32:538*000-345214*Ввод атрибутов' AS str
)
, RECURSIVE w_recursive(source_string, lvl, val)
AS
(
  SELECT  str AS source_string
          , 1 AS lvl
          , SUBSTR(str, INSTR(str, '*') + 1, TO_NUMBER(SUBSTR(str, 1, INSTR(str, '*') - 1))) AS val
  FROM    w_data  
  UNION ALL
  SELECT SUBSTR(n.source_string, INSTR(n.source_string, '*') + 1 + TO_NUMBER(SUBSTR(n.source_string, 1, INSTR(n.source_string, '*') - 1)))
         , lvl + 1
         , SUBSTR(n.source_string, INSTR(n.source_string, '*') + 1, TO_NUMBER(SUBSTR(n.source_string, 1, INSTR(n.source_string, '*') - 1)))
  FROM   w_data o
         JOIN w_recursive n ON LENGTH(n.source_string) >0
)
SELECT *
FROM   w_recursive
WHERE lvl > 1
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Другие СУБД [игнор отключен] [закрыт для гостей] / Teradata , inline Function
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]