Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Обявить функцию внутри SQLPlus скрипта. / 25 сообщений из 44, страница 1 из 2
16.01.2019, 13:03
    #39760244
RascalBus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обявить функцию внутри SQLPlus скрипта.
Всем здоровья и удачи, други.

Ищу помощи в следующем, заранее извиняюсь за грамматику, русский для меня язык дополнительный.

Вводные:
База: Oracle 12c Standard Edition 12.1.0.2.0-64bit

Доступ к базе только ReadOnly и только через SQLPlus.
В базе ничего нельзя создавать (ни функции, ни процедуры, ничего совсем вообще никем никогда и низачто)

Задача:
Выгрузить содержимое таблицы в текстовый фаил , попутно обьявив и применив самодельную функцию.

Имеется следующий скрипт

Код: plsql
1.
2.
3.
spool c:\exp\cust.txt
Select name from cust;
spool off 


Хочется что-то типа:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Declare Function foo (iStr IN VARCHAR2) 
RETURN VARCHAR2 IS

BEGIN
RETURN 'ffOkin ' || iStr ;
END;

Select foo(name) from cust;
spool c:\exp\cust.txt
spool off



Тут cказали, что ето невозможно.

https://stackoverflow.com/questions/21856832/local-function-inside-pl-sql-script

Но надежда ж умирает последней, поэтому я здесь и спрашиваю.
Подскажите, пожалуйста.
...
Рейтинг: 0 / 0
16.01.2019, 13:07
    #39760248
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обявить функцию внутри SQLPlus скрипта.
...
Рейтинг: 0 / 0
16.01.2019, 13:16
    #39760250
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обявить функцию внутри SQLPlus скрипта.
RascalBus,

1. Необходимость в функции не обоснована.
2. помимо with function есть dbms_output.
3. "только через SQLPlus" не обосновано.
...
Рейтинг: 0 / 0
16.01.2019, 13:24
    #39760253
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обявить функцию внутри SQLPlus скрипта.
1. Вопрос о логике функции не праздный. Если просто конкатенация строк - то используйте штатный || и забудьте.
Если что-то сложное (не так просто придумать сложную пользовательскую логику на RO-базе) - то, быть может, найдется альтернативное решение.
2. Вывод SQL*Plus ничто не мешает отправить в постобработку любым удобным/доступным методом.
...
Рейтинг: 0 / 0
16.01.2019, 21:53
    #39760539
RascalBus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обявить функцию внутри SQLPlus скрипта.
Спасибо, добрый человек Вячеслав Любомудров.

Это похоже то, что мне нужно.

Однако, скопировав и запустив код получаю ошибку.

Код: plsql
1.
2.
3.
4.
5.
ORA-00905: missing keyword
00905. 00000 -  "missing keyword"
*Cause:    
*Action:
Error at Line: 2 Column: 11



Подскажите, что я нетак делаю, пожалуйста.
...
Рейтинг: 0 / 0
16.01.2019, 22:23
    #39760546
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обявить функцию внутри SQLPlus скрипта.
Версия SQL*Developer? Версия базы?

SY.
...
Рейтинг: 0 / 0
17.01.2019, 00:13
    #39760574
RascalBus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обявить функцию внутри SQLPlus скрипта.
SY,

Oracle Database Express Edition (XE) Release 18.4.0.0.0 (18c)
SQL Developer 18.4 Version 18.4.0-376.1900
...
Рейтинг: 0 / 0
17.01.2019, 01:14
    #39760577
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обявить функцию внутри SQLPlus скрипта.
RascalBus,

18C не имею.

На моем SQL*Developer 4.1.4.21 и базе 12.1.0.2.0 EE полет нормальный. А ORA-00905 говорит о том что версия базы не поддерживает WITH FUNCTION.

Код: plsql
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.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
I:\>sqlplus /nolog

SQL*Plus: Release 12.1.0.2.0 Production on Wed Jan 16 17:05:12 2019

Copyright (c) 1982, 2014, Oracle.  All rights reserved.

SQL> connect scott
Enter password:
Connected.
SQL> select  version
  2    from  v$instance
  3  /

VERSION
-----------------
10.2.0.5.0

SQL> with function f(
  2                  p_num number
  3                 )
  4         return number
  5         is
  6         begin
  7             return p_num;
  8         end;
  9  select  f(sal)
 10    from  emp
 11    where deptno = 10
 12  /
with function f(
              *
ERROR at line 1:
ORA-00905: missing keyword


SQL> connect scott@pdb1sol12
Enter password:
Connected.
SQL> select  version
  2    from  v$instance
  3  /

VERSION
-----------------
12.1.0.2.0

SQL> with function f(
  2                  p_num number
  3                 )
  4         return number
  5         is
  6         begin
  7             return p_num;
  8         end;
  9  select  f(sal)
 10    from  emp
 11    where deptno = 10
 12  /

    F(SAL)
----------
      2450
      5000
      1300

SQL>



Так-что ты либо конектишься не туда либо WITH FUNCTION в XE не поддерживается (c XE не работаю и посему не знаю что там обрeзано).

SY.
...
Рейтинг: 0 / 0
17.01.2019, 01:50
    #39760582
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обявить функцию внутри SQLPlus скрипта.
SYТак-что ты либо либо в функции ошибка.
...
Рейтинг: 0 / 0
17.01.2019, 10:21
    #39760663
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обявить функцию внутри SQLPlus скрипта.
RascalBusOracle Database Express Edition
В девелоперской базе и ReadOnly — это довольно странно.
...
Рейтинг: 0 / 0
17.01.2019, 11:08
    #39760698
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обявить функцию внутри SQLPlus скрипта.
Alibek B.,

про read only указана se
...
Рейтинг: 0 / 0
17.01.2019, 14:06
    #39760864
RascalBus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обявить функцию внутри SQLPlus скрипта.
Не смогли мы с коллегами решить ету задачу.

Пойдем в в кофейню есть пирожки без мяса и думать о делах наших скорбных.

Всем спасибо за помощь.
...
Рейтинг: 0 / 0
17.01.2019, 15:15
    #39760942
Vadim Lejnin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обявить функцию внутри SQLPlus скрипта.
RascalBusНе смогли мы с коллегами решить ету задачу.

Пойдем в в кофейню есть пирожки без мяса и думать о делах наших скорбных.

Всем спасибо за помощь.

action plan:
1) Встать с дивана
2) надеть штаны

Пардон, чуток не так...
1) Запустить sqlplus
2) Научится копировать текст с консольного окна cmd.exe
3) скопировать полученный вывод в буфер обмена системы
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
select * from v$version;

WITH
 FUNCTION get_domain(url VARCHAR2) RETURN VARCHAR2 IS
   pos BINARY_INTEGER;
   len BINARY_INTEGER;
 BEGIN
   pos := INSTR(url, 'www.');
   len := INSTR(SUBSTR(url, pos + 4), '.') - 1;
   RETURN SUBSTR(url, pos + 4, len);
 END;
SELECT DISTINCT get_domain(catalog_url)
  FROM product_information;
/



4) показать что получилось используя тэги форума SRC
...
Рейтинг: 0 / 0
17.01.2019, 16:48
    #39761046
RascalBus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обявить функцию внутри SQLPlus скрипта.
Vadim Lejnin,

Это результат на локально установленном Оракле.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
select * from v$version;
------------------------------------------------------------------------------------

Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
PL/SQL Release 11.2.0.2.0 - Production
"CORE	11.2.0.2.0	Production"
TNS for 64-bit Windows: Version 11.2.0.2.0 - Production
NLSRTL Version 11.2.0.2.0 - Production




Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
WITH
 FUNCTION get_domain(url VARCHAR2) RETURN VARCHAR2 IS
   pos BINARY_INTEGER;
   len BINARY_INTEGER;
 BEGIN
   pos := INSTR(url, 'www.');
   len := INSTR(SUBSTR(url, pos + 4), '.') - 1;
   RETURN SUBSTR(url, pos + 4, len);
 END;
SELECT DISTINCT get_domain(catalog_url)
  FROM product_information;
/
------------------------------------------------------------------------------------

ORA-00905: missing keyword
00905. 00000 -  "missing keyword"
*Cause:    
*Action:
Error at Line: 4 Column: 11
...
Рейтинг: 0 / 0
17.01.2019, 16:52
    #39761052
rf_mail
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обявить функцию внутри SQLPlus скрипта.
...
Рейтинг: 0 / 0
17.01.2019, 17:06
    #39761059
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обявить функцию внутри SQLPlus скрипта.
RascalBus,

И Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production не наводит ни на какие мысли?

SY.
...
Рейтинг: 0 / 0
17.01.2019, 18:25
    #39761096
RascalBus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обявить функцию внутри SQLPlus скрипта.
Это результат на сервере Оракл , это тот который ReadOnly и откуда надо данные экстрактить в текстовый файл с функцией.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select * from v$version;

---------------------------------------------

Oracle Database 12c Standard Edition Release 12.1.0.2.0 - 64bit Production
PL/SQL Release 12.1.0.2.0 - Production
"CORE   12.1.0.2.0             Production"
TNS for 64-bit Windows: Version 12.1.0.2.0 - Production
NLSRTL Version 12.1.0.2.0 - Production



Код: plsql
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.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
WITH
FUNCTION get_domain(url VARCHAR2) RETURN VARCHAR2 IS
   pos BINARY_INTEGER;
   len BINARY_INTEGER;
BEGIN
   pos := INSTR(url, 'www.');
   len := INSTR(SUBSTR(url, pos + 4), '.') - 1;
   RETURN SUBSTR(url, pos + 4, len);
END;
SELECT DISTINCT get_domain(catalog_url)
  FROM product_information;

/

--Query result---------------------------------------------



ORA-06553: PLS-103: Encountered the symbol "end-of-file" when expecting one of the following:

   := . ( @ % ; not null range default character
06553. 00000 -  "PLS-%s: %s"
*Cause:    
*Action:
Error at Line: 4 Column: 1

--Script Output -------------------------------------------

Error starting at line 6 in command:
len BINARY_INTEGER
Error report:
Unknown Command

Error starting at line 7 in command:
BEGIN
   pos := INSTR(url, 'www.');
   len := INSTR(SUBSTR(url, pos + 4), '.') - 1;
   RETURN SUBSTR(url, pos + 4, len);
END;

SELECT DISTINCT get_domain(catalog_url)
  FROM product_information;
Error report:
ORA-06550: line 7, column 1:
PLS-00103: Encountered the symbol "SELECT" 
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:
...
Рейтинг: 0 / 0
17.01.2019, 18:29
    #39761100
RascalBus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обявить функцию внутри SQLPlus скрипта.
SY,

Без Вашей подсказки мысли отсутствовали.
А с подсказкой догадываюсь, что WITH появился лишь в следующей (12ой) версии.
...
Рейтинг: 0 / 0
17.01.2019, 18:30
    #39761101
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обявить функцию внутри SQLPlus скрипта.
RascalBusЭто результат на сервере ОраклТолько теперь снова вопрос про клиента.
Вот зачем тебе plsql-функция для выкусывания подстроки. Выражение, даже на инстр-субстр, короче, чем декларация функции.
...
Рейтинг: 0 / 0
17.01.2019, 18:34
    #39761102
RascalBus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обявить функцию внутри SQLPlus скрипта.
rf_mail,

Ааааа, понял.
Спасибо.
Сервер 12й , а скулплюс 11.
И менять ничего нельзя, ибо с подрядчиком cпецифические отношения.


Ой беда-печаль.
:(
...
Рейтинг: 0 / 0
17.01.2019, 18:44
    #39761107
Vadim Lejnin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обявить функцию внутри SQLPlus скрипта.
RascalBus,

сработает в любой версии sqlplus
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
set serveroutput on
spool ...
declaration
...
function xxx(...) as 
...
begin
for x in ( select * from table) loop
dbms_output.put_line(xxx(x));
end loop;
end;
/
...
Рейтинг: 0 / 0
17.01.2019, 18:51
    #39761113
RascalBus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обявить функцию внутри SQLPlus скрипта.
-2-,

Функция будет сложна и многогранна.
...
Рейтинг: 0 / 0
17.01.2019, 18:53
    #39761114
RascalBus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обявить функцию внутри SQLPlus скрипта.
Спасибо, добрый человек Vadim Lejnin.

Сейчас попробую отпишусь.
...
Рейтинг: 0 / 0
17.01.2019, 18:54
    #39761115
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обявить функцию внутри SQLPlus скрипта.
RascalBusСервер 12й , а скулплюс 11.
И менять ничего нельзя, ибо с подрядчиком cпецифические отношения.


Ой беда-печаль.Ещё не конец. DSQL в зубы …
...
Рейтинг: 0 / 0
17.01.2019, 19:00
    #39761117
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обявить функцию внутри SQLPlus скрипта.
RascalBusrf_mail,

Ааааа, понял.
Спасибо.
Сервер 12й , а скулплюс 11.
И менять ничего нельзя, ибо с подрядчиком cпецифические отношения.


Ой беда-печаль.
:(

12-й с флешки запустите

....
stax
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Обявить функцию внутри SQLPlus скрипта. / 25 сообщений из 44, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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