powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Обявить функцию внутри SQLPlus скрипта.
25 сообщений из 44, страница 1 из 2
Обявить функцию внутри SQLPlus скрипта.
    #39760244
Фотография RascalBus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем здоровья и удачи, други.

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

Вводные:
База: 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
Обявить функцию внутри SQLPlus скрипта.
    #39760248
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Обявить функцию внутри SQLPlus скрипта.
    #39760250
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RascalBus,

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

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

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

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



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

SY.
...
Рейтинг: 0 / 0
Обявить функцию внутри SQLPlus скрипта.
    #39760574
Фотография RascalBus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Обявить функцию внутри SQLPlus скрипта.
    #39760577
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Обявить функцию внутри SQLPlus скрипта.
    #39760582
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYТак-что ты либо либо в функции ошибка.
...
Рейтинг: 0 / 0
Обявить функцию внутри SQLPlus скрипта.
    #39760663
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RascalBusOracle Database Express Edition
В девелоперской базе и ReadOnly — это довольно странно.
...
Рейтинг: 0 / 0
Обявить функцию внутри SQLPlus скрипта.
    #39760698
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

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

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

Всем спасибо за помощь.
...
Рейтинг: 0 / 0
Обявить функцию внутри SQLPlus скрипта.
    #39760942
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Обявить функцию внутри SQLPlus скрипта.
    #39761046
Фотография RascalBus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Обявить функцию внутри SQLPlus скрипта.
    #39761052
Фотография rf_mail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Обявить функцию внутри SQLPlus скрипта.
    #39761059
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RascalBus,

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

SY.
...
Рейтинг: 0 / 0
Обявить функцию внутри SQLPlus скрипта.
    #39761096
Фотография RascalBus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это результат на сервере Оракл , это тот который 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
Обявить функцию внутри SQLPlus скрипта.
    #39761100
Фотография RascalBus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY,

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

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


Ой беда-печаль.
:(
...
Рейтинг: 0 / 0
Обявить функцию внутри SQLPlus скрипта.
    #39761107
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Обявить функцию внутри SQLPlus скрипта.
    #39761113
Фотография RascalBus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-,

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

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


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

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


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

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

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


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