powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / 12C знакомые мелодии на тему PL/SQL и new features
25 сообщений из 34, страница 1 из 2
12C знакомые мелодии на тему PL/SQL и new features
    #38365353
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
SQL> create or replace
  2    procedure proc_test(
  3                        v_empno in number,
  4                        v_ref_cursor out sys_refcursor
  5                       )
  6      is
  7      begin
  8      open v_ref_cursor
  9        for
 10          with function get_dept_name(
 11                                      p_department_id number
 12                                     )
 13                 return varchar2
 14                 is
 15                     v_dept_name varchar2(100);
 16                 begin
 17                     select  department_name
 18                       into  v_dept_name
 19                       from  hr.departments
 20                       where department_id = p_department_id;
 21                     return v_dept_name;
 22                 end;
 23          select  e.last_name,
 24                  get_dept_name(e.department_id) department_name
 25            from  hr.employees e
 26          where e.employee_id = v_empno;
 27  end;
 28  /

Warning: Procedure created with compilation errors.

SQL> show err
Errors for PROCEDURE PROC_TEST:

LINE/COL ERROR
-------- -----------------------------------------------------------------
9/9      PL/SQL: SQL Statement ignored
9/23     PL/SQL: ORA-00905: missing keyword
SQL>



И традиционный "workaround":

Код: 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.
SQL> create or replace
  2    procedure proc_test(
  3                        v_empno in number,
  4                        v_ref_cursor out sys_refcursor
  5                       )
  6      is
  7      begin
  8      open v_ref_cursor
  9        for
 10          'with function get_dept_name(
 11                                      p_department_id number
 12                                     )
 13                 return varchar2
 14                 is
 15                     v_dept_name varchar2(100);
 16                 begin
 17                     select  department_name
 18                       into  v_dept_name
 19                       from  hr.departments
 20                       where department_id = p_department_id;
 21                     return v_dept_name;
 22                 end;
 23          select  e.last_name,
 24                  get_dept_name(e.department_id) department_name
 25            from  hr.employees e
 26          where e.employee_id = :1' using v_empno;
 27  end;
 28  /

Procedure created.

SQL> variable rc refcursor
SQL> exec proc_test(100,:rc)

PL/SQL procedure successfully completed.

SQL> print rc

LAST_NAME                 DEPARTMENT_NAME
------------------------- --------------------
King                      Executive

SQL>



SY.
...
Рейтинг: 0 / 0
12C знакомые мелодии на тему PL/SQL и new features
    #38365483
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY,

или через вьюху?
...
Рейтинг: 0 / 0
12C знакомые мелодии на тему PL/SQL и new features
    #38365542
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очень интересно. plsql_declarations отсылает на все те-же CREATE FUNCTION/PROCEDURE и Chapter 8, "PL/SQL Subprograms" где так-же как и в 11G черным по белому разьясняется AUTHID DEFINER роли игнорирует. A действительность такова:

Код: 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.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
SQL> drop role r1
  2  /

Role dropped.

SQL> drop user u1 cascade
  2  /

User dropped.

SQL> create user u1 identified by u1 default tablespace users;

User created.

SQL> create role r1;

Role created.

SQL> grant select on emp to r1;

Grant succeeded.

SQL> grant select on dept to r1;

Grant succeeded.

SQL> grant r1 to u1;

Grant succeeded.

SQL> grant create session to u1;

Grant succeeded.

SQL> connect u1@pdborcl12/u1
Connected.
SQL> create or replace
  2    function get_dept_name(
  3                           p_deptno number
  4                          )
  5      return varchar2
  6      is
  7          v_dname varchar2(30);
  8      begin
  9          select  dname
 10            into  v_dname
 11            from  scott.dept
 12            where deptno = p_deptno;
 13          return v_dname;
 14  end;
 15  /
create or replace
*
ERROR at line 1:
ORA-01031: insufficient privileges


SQL> with function get_dept_name(
  2                              p_deptno number
  3                             )
  4         return varchar2
  5         is
  6          v_dname varchar2(30);
  7         begin
  8             select  dname
  9               into  v_dname
 10               from  scott.dept
 11               where deptno = p_deptno;
 12             return v_dname;
 13       end;
 14  select  ename,
 15          get_dept_name(e.deptno) dname
 16    from  scott.emp e
 17  /

ENAME      DNAME
---------- ---------------
SMITH      RESEARCH
ALLEN      SALES
WARD       SALES
JONES      RESEARCH
MARTIN     SALES
BLAKE      SALES
CLARK      ACCOUNTING
SCOTT      RESEARCH
KING       ACCOUNTING
TURNER     SALES
ADAMS      RESEARCH

ENAME      DNAME
---------- ---------------
JAMES      SALES
FORD       RESEARCH
MILLER     ACCOUNTING

14 rows selected.

SQL>



Вопрос баг это или фича. Лучше бы последнее.

SY.
...
Рейтинг: 0 / 0
12C знакомые мелодии на тему PL/SQL и new features
    #38365593
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
конечно, это прикольно - в sql свои фнукции писать.
Но это ж под каждый запрос свой экземпляр функции.
Если менять текст этой функции - так во всех запросах.
...
Рейтинг: 0 / 0
12C знакомые мелодии на тему PL/SQL и new features
    #38365604
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYВопрос баг это или фича
На первый непросвещенный взгляд больше на фичу похоже.

ORA-01031: - отсутствие прав на создание именованного объекта БД заданного сорта.

Ф-ция в селекте - часть самого селекта, а не самостоятельный именованный объект в БД.
И живет как неотъемлемый от селекта кусок для sql-разбора.

На баг это будет тянуть, если ф-ция в with сможет предоставить доступ к таблице, на которую нет явных или косвенных прав доступа.


авторЕсли менять текст этой функции - так во всех запросах.
Думаю, так нет смысла говорить. Область повторного использования with - конкретный селект, а не их множество.
Печалиться об этом выглядит как действие, не пригодное к оцениванию в терминах добра и зла.
...
Рейтинг: 0 / 0
12C знакомые мелодии на тему PL/SQL и new features
    #38365636
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYВопрос баг это или фича. Лучше бы последнее.Те же яйца:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
declare
   --
   procedure p ...
...
begin 
   p;
end;
...
Рейтинг: 0 / 0
12C знакомые мелодии на тему PL/SQL и new features
    #38365637
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
интересно, насколько велика будет допустимая сложность таких функций
и наличие возможности отладки

ЗЫ: пока даже не представляю, где я их реально буду использовать
...
Рейтинг: 0 / 0
12C знакомые мелодии на тему PL/SQL и new features
    #38365711
_Nikotin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY,

Попробуй через дерез динамический SQL коллекции побиндить, оно либо рогуется на то что не все переменные прибинжены, либо
ORA-00600: internal error code, arguments: [opipls4], [no bind direction set], [], [], [], [], [], [], [], [], [], []
...
Рейтинг: 0 / 0
12C знакомые мелодии на тему PL/SQL и new features
    #38365737
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymxЗЫ: пока даже не представляю, где я их реально буду использоватьпридумал где )
можно будет меньше вложенных подзапросов
...
Рейтинг: 0 / 0
12C знакомые мелодии на тему PL/SQL и new features
    #38366084
Фотография orawish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYОчень интересно. plsql_declarations отсылает на все те-же CREATE FUNCTION/PROCEDURE и Chapter 8, "PL/SQL Subprograms" где так-же как и в 11G черным по белому разьясняется AUTHID DEFINER роли игнорирует. A действительность такова:
..

Вопрос баг это или фича. Лучше бы последнее.

SY.
имхо, всё логично.
with function до боли похож на pl/sql, но таки суть чистый sql
...
Рейтинг: 0 / 0
12C знакомые мелодии на тему PL/SQL и new features
    #38366359
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orawishимхо, всё логично.
with function до боли похож на pl/sql, но таки суть чистый sqlсамое интересное, что они смогут возвращать разный результат при одном и том же тексте :)
...
Рейтинг: 0 / 0
12C знакомые мелодии на тему PL/SQL и new features
    #38366391
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-Те же яйца

Не совсем. Локальную функцию нельзя использовать в SQL:

Код: 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.
SQL> declare
  2      function get_dept_name(
  3                             p_deptno number
  4                          )
  5        return varchar2
  6        is
  7            v_dname varchar2(30);
  8        begin
  9            select  dname
 10              into  v_dname
 11              from  scott.dept
 12              where deptno = p_deptno;
 13            return v_dname;
 14      end;
 15  begin
 16      for v_rec in (select ename,get_dept_name(e.deptno) dname from scott.emp e) loop
 17        dbms_output.put_line(v_rec.ename || ', ' || v_rec.dname);
 18      end loop;
 19  end;
 20  /
    for v_rec in (select ename,get_dept_name(e.deptno) dname from scott.emp e) loop
                               *
ERROR at line 16:
ORA-06550: line 16, column 32:
PLS-00231: function 'GET_DEPT_NAME' may not be used in SQL
ORA-06550: line 16, column 32:
PL/SQL: ORA-00904: : invalid identifier
ORA-06550: line 16, column 19:
PL/SQL: SQL Statement ignored
ORA-06550: line 17, column 28:
PLS-00364: loop index variable 'V_REC' use is invalid
ORA-06550: line 17, column 7:
PL/SQL: Statement ignored


SQL>



Т.е. с помощью WITH FUNCTION можно обойти ситуацию когда привилегий напрямую нет, есть только через роль.

SY.
...
Рейтинг: 0 / 0
12C знакомые мелодии на тему PL/SQL и new features
    #38366419
_Nikotin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY,

Почитай про bequeath для view, не совсем то, но забавно. И с глюками :-)
...
Рейтинг: 0 / 0
12C знакомые мелодии на тему PL/SQL и new features
    #38366518
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY-2-Те же яйцаНе совсем. Локальную функцию нельзя использовать в SQLя о том, что локальная функция в анонимном блоке и локальная в sql-"блоке" с точки зрения прав ведут себя одинаково.
...
Рейтинг: 0 / 0
12C знакомые мелодии на тему PL/SQL и new features
    #38366601
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_NikotinSY,

Почитай про bequeath для view, не совсем то, но забавно.

А чем забавно?

SY.
...
Рейтинг: 0 / 0
12C знакомые мелодии на тему PL/SQL и new features
    #38366964
_Nikotin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY,

В смысле само по себе забавно - вьюха как дефайнер работает, а authid current_user функции внутри - с правами того кто вьюху селектит. Винегрет какой-то.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
12C знакомые мелодии на тему PL/SQL и new features
    #39306581
dimyaz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А есть среды разработки, которые поддерживают этот функционал?

Просто у меня простой запросик:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
WITH                                                                          
FUNCTION str_plus(p_str VARCHAR2) RETURN VARCHAR2
IS
BEGIN
   RETURN p_str || ' World';
END;
SELECT str_plus('Hello') FROM dual;
/



Отработал только на sqlplus.

SQL Developer и тем более PL/SQL Developer отказываются его воспринимать.
...
Рейтинг: 0 / 0
12C знакомые мелодии на тему PL/SQL и new features
    #39306592
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimyazОтработал только на sqlplus. SQL Developer и тем более PL/SQL Developer отказываются его воспринимать.

SQL*Plus отработал гворишь? Медитируй над:

Код: 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.
SQL*Plus: Release 11.2.0.3.0 Production on Fri Sep 9 06:49:26 2016

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

Enter user-name: scott@pdborcl12
Enter password:

Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

SQL> WITH
  2  FUNCTION str_plus(p_str VARCHAR2) RETURN VARCHAR2
  3  IS
  4  BEGIN
  5     RETURN p_str || ' World';
FUNCTION str_plus(p_str VARCHAR2) RETURN VARCHAR2
*
ERROR at line 2:
ORA-06553: PLS-103: Encountered the symbol "end-of-file" when expecting one of
the following:
* & = - + ; < / > at in is mod remainder not rem
<an exponent (**)> <> or != or ~= >= <= <> and or like like2
like4 likec between || member submultiset


SQL> END;
SP2-0042: unknown command "END" - rest of line ignored.
SQL> SELECT str_plus('Hello') FROM dual;
SELECT str_plus('Hello') FROM dual
       *
ERROR at line 1:
ORA-00904: "STR_PLUS": invalid identifier


SQL> /



И:

Код: 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.
SQL*Plus: Release 12.1.0.1.0 Production on Fri Sep 9 06:50:09 2016

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

Enter user-name: scott@pdborcl12
Enter password:
Last Successful login time: Fri Sep 09 2016 06:49:40 -04:00

Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

SQL> WITH
  2  FUNCTION str_plus(p_str VARCHAR2) RETURN VARCHAR2
  3  IS
  4  BEGIN
  5     RETURN p_str || ' World';
  6  END;
  7  SELECT str_plus('Hello') FROM dual;
  8  /

STR_PLUS('HELLO')
--------------------------------------------------------------------------------
Hello World

SQL>



Когда промедитируешь то пoлучишь ответ и для SQL Developer.

A когда промедитируешь над:

Код: 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.
SQL*Plus: Release 12.1.0.1.0 Production on Fri Sep 9 06:55:21 2016

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

Enter user-name: scott@pdborcl12
Enter password:
Last Successful login time: Fri Sep 09 2016 06:52:27 -04:00

Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

SQL> DECLARE
  2      V_RES VARCHAR2(20);
  3  BEGIN
  4      WITH
  5      FUNCTION str_plus(p_str VARCHAR2) RETURN VARCHAR2
  6      IS
  7      BEGIN
  8         RETURN p_str || ' World';
  9      END;
 10      SELECT str_plus('Hello') INTO V_RES FROM dual;
 11      DBMS_OUTPUT.PUT_LINE(V_RES);
 12  END;
 13  /
    FUNCTION str_plus(p_str VARCHAR2) RETURN VARCHAR2
             *
ERROR at line 5:
ORA-06550: line 5, column 14:
PL/SQL: ORA-00905: missing keyword
ORA-06550: line 4, column 5:
PL/SQL: SQL Statement ignored
ORA-06550: line 10, column 5:
PLS-00103: Encountered the symbol "SELECT"


SQL>



то и вопрос по PL/SQL Developer отпадет.

SY.
...
Рейтинг: 0 / 0
12C знакомые мелодии на тему PL/SQL и new features
    #39306597
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
12C знакомые мелодии на тему PL/SQL и new features
    #39306635
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicSYSQL*Plus отработал гворишь? Нужно всего лишь правильно прятать запяточие

Все зависит от парсера клиента. Запяточие тут ни причем - попробуй свой SQL введенный не в одну строку:

Код: 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.
SQL> with function f(x in int) return int is begin return -x; end; select f(rownum) from dual
  2  /

 F(ROWNUM)
----------
        -1

SQL> with function f(x in int) return int
  2  is begin return -x; end; select f(rownum) from dual
  3  /

 F(ROWNUM)
----------
        -1

SQL> with function f(x in int) return int is begin return -x; end;
with function f(x in int) return int is begin return -x; end
     *
ERROR at line 1:
ORA-06553: PLS-103: Encountered the symbol "end-of-file" when expecting one of
the following:
; <an identifier> <a double-quoted delimited-identifier>
current delete exists prior <a single-quoted SQL string>
The symbol ";" was substituted for "end-of-file" to continue.


SQL> with function f(x in int) return int is begin return -x;
with function f(x in int) return int is begin return -x
     *
ERROR at line 1:
ORA-06553: PLS-103: Encountered the symbol "end-of-file" when expecting one of
the following:
. ( * @ % & = - + ; < / > at in is mod remainder not rem
<an exponent (**)> <> or != or ~= >= <= <> and or like like2
like4 likec between || member submultiset


SQL> with function f(x in int) return
  2  int is begin return -x;
with function f(x in int) return
     *
ERROR at line 1:
ORA-06553: PLS-103: Encountered the symbol "end-of-file" when expecting one of
the following:
. ( * @ % & = - + ; < / > at in is mod remainder not rem
<an exponent (**)> <> or != or ~= >= <= <> and or like like2
like4 likec between || member submultiset


SQL>



SY.
...
Рейтинг: 0 / 0
12C знакомые мелодии на тему PL/SQL и new features
    #39306641
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Упс, дошло.

SY.
...
Рейтинг: 0 / 0
12C знакомые мелодии на тему PL/SQL и new features
    #39306679
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimyazА есть среды разработки, которые поддерживают этот функционал?

Просто у меня простой запросик:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
WITH                                                                          
FUNCTION str_plus(p_str VARCHAR2) RETURN VARCHAR2
IS
BEGIN
   RETURN p_str || ' World';
END;
SELECT str_plus('Hello') FROM dual;
/



Отработал только на sqlplus.

SQL Developer и тем более PL/SQL Developer отказываются его воспринимать.

Возьмите свежий SQL Developer.

Функции в WITH поддерживает Oracle SQL Developer 4.0.2 и старше.
...
Рейтинг: 0 / 0
12C знакомые мелодии на тему PL/SQL и new features
    #39306680
dimyaz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY,

Итак медитация с sqldeveloper помогла, после установки официально последней версии.


Тоже самое сделал с PL/SQL Developer, но он не хочет выполнять команду все равно.
...
Рейтинг: 0 / 0
12C знакомые мелодии на тему PL/SQL и new features
    #39306705
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimyazSY,

Итак медитация с sqldeveloper помогла, после установки официально последней версии.


Тоже самое сделал с PL/SQL Developer, но он не хочет выполнять команду все равно.
Что вам ответили в техподдержке компании Allround Automations?
...
Рейтинг: 0 / 0
12C знакомые мелодии на тему PL/SQL и new features
    #39306727
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimyazSY,
Тоже самое сделал с PL/SQL Developer, но он не хочет выполнять команду все равно.

По "традиции" PL/SQL Release 1 каждой версии не поддерживает многие новые возожности SQL. Обход - динамический SQL.

SY.
...
Рейтинг: 0 / 0
25 сообщений из 34, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / 12C знакомые мелодии на тему PL/SQL и new features
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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