Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Bind variables: & вместо : / 17 сообщений из 17, страница 1 из 1
27.09.2017, 17:17
    #39527235
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Bind variables: & вместо :
Что-то я впервые сейчас столкнулся: в тексте запроса (v$sqlarea.sql_text/sql_fulltext) bind variables указаны через &, например:
Код: plsql
1.
select * from dual where x=&var


и это реально работает!
В плане при этом предикаты показывает как x=:var.

Когда такое появилось? sqlplus точно это не поддерживает - я проверил. Это только некоторые драйвера поддерживают?
Запрос этот из софтины, которая юзает DOA
...
Рейтинг: 0 / 0
27.09.2017, 17:18
    #39527236
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Bind variables: & вместо :
Причем разработчик утверждает, что в самой софтине это запрос написан через ":", но драйвер сам его так преобразовывает...
...
Рейтинг: 0 / 0
27.09.2017, 17:30
    #39527240
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Bind variables: & вместо :
у нас четко видны двоеточия
& <= эту хрень никогда не видел
смотрю обычно v$sql_text_with_new_lines
...
Рейтинг: 0 / 0
27.09.2017, 17:39
    #39527243
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Bind variables: & вместо :
и это единственный такой запрос в базе сейчас
...
Рейтинг: 0 / 0
27.09.2017, 17:46
    #39527245
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Bind variables: & вместо :
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SQL> set def off
SQL> set serverout on
SQL> declare s varchar2(1); begin execute immediate 'select 1 from dual where dummy=&var' into s using 'X'; dbms_output.put_line(s); end;
  2  /
1

SQL> select * from v$version;

BANNER                                                                               CON_ID
-------------------------------------------------------------------------------- ----------
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production              0
PL/SQL Release 12.2.0.1.0 - Production                                                    0
CORE    12.2.0.1.0      Production                                                                0
TNS for Linux: Version 12.2.0.1.0 - Production                                            0
NLSRTL Version 12.2.0.1.0 - Production                                                    0
...
Рейтинг: 0 / 0
27.09.2017, 17:49
    #39527246
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Bind variables: & вместо :
и на 11.2.0.2 то же самое:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SQL> set def off serverout on
SQL> exec declare s varchar2(1); begin execute immediate 'select 1 from dual where dummy=&var' into s using 'X'; dbms_output.put_line(s); end;
1

PL/SQL procedure successfully completed.

SQL> select * from v$version;

BANNER
-------------------------------------------------------------------------------------------------------------
Oracle Database 11g Enterprise 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

5 rows selected.



тест-кейс:
Код: plsql
1.
2.
set def off serverout on
exec declare s varchar2(1); begin execute immediate 'select 1 from dual where dummy=&var' into s using 'X'; dbms_output.put_line(s); end;
...
Рейтинг: 0 / 0
27.09.2017, 18:12
    #39527259
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Bind variables: & вместо :
xtender,

11.2.0.4 поддерживает.

В доке немногословно сказано
If the dynamic SQL statement includes placeholders for bind variables, each placeholder must have a corresponding bind variable in the appropriate clause of the EXECUTE IMMEDIATE statement, as follows

* If the dynamic SQL statement is a SELECT statement that can return at most one row, put out-bind variables ( defines ) in the INTO clause and in-bind variables in the USING clause.
...
Рейтинг: 0 / 0
27.09.2017, 18:19
    #39527263
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Bind variables: & вместо :
env,

это не относится к dynamic SQL, это вообще общий placeholder...
В доке есть только :
https://docs.oracle.com/database/122/SQLRF/Placeholder-Expressions.htm#SQLRF52091
...
Рейтинг: 0 / 0
28.09.2017, 04:11
    #39527383
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Bind variables: & вместо :
https://mytram.wordpress.com/2014/09/02/oracles-oci-accepts-ampersand-as-legal-indicators-for-bind-variable-placeholders-undocumented/

Оно и в 9.2 работает
Да и в DBMS_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.
Connected to:
Oracle9i Enterprise Edition Release 9.2.0.7.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.7.0 - Production

SQL> set def off serverout on
SQL> exec declare s varchar2(1); begin execute immediate 'select 1 from dual where dummy=&var' into s using 'X'; dbms_output.put_line(s); end;
1

PL/SQL procedure successfully completed.

SQL> declare c number := dbms_sql.open_cursor;
  2      ret varchar2(10) := 'No';
  3      dm varchar2(1) := 'X';
  4      n number;
  5  begin dbms_sql.parse(c, 'select ''Yes'' from dual where dummy='||'&d', dbms_sql.native);
  6        dbms_sql.define_column(c, 1, ret, 10);
  7        dbms_sql.bind_variable(c, ':d', dm); -- '&d' тоже работает
  8        n := dbms_sql.execute_and_fetch(c);
  9        dbms_sql.column_value(c, 1, ret);
 10        dbms_output.put_line(ret);
 11  end;
 12  /
Yes

PL/SQL procedure successfully completed.

...
Рейтинг: 0 / 0
28.09.2017, 04:53
    #39527388
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Bind variables: & вместо :
Вячеслав Любомудров,

Ты этот блог нагуглил или ранее как-то прочёл? Я такого прежде не видел...
...
Рейтинг: 0 / 0
28.09.2017, 04:56
    #39527389
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Bind variables: & вместо :
Очень неудобно, блин, с такими запросами - многие тулзы поддерживают только замену для амперсанда
...
Рейтинг: 0 / 0
28.09.2017, 05:16
    #39527393
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Bind variables: & вместо :
Вячеслав Любомудров,

а к 9.2 подключался каким sqlplus? тоже от 9.2 с его же клиентом?
...
Рейтинг: 0 / 0
28.09.2017, 05:31
    #39527394
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Bind variables: & вместо :
забавно, это работает только для SQL, в PL/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> var v varchar2(1);
SQL> exec &v := 'X';
BEGIN &v := 'X'; END;

      *
ERROR at line 1:
ORA-06550: line 1, column 7:
PLS-00103: Encountered the symbol "&" when expecting one of the following:
( begin case declare exit for goto if loop mod null pragma...
The symbol "&" was ignored.


SQL> exec :v := 'X';

PL/SQL procedure successfully completed.

SQL> select * from dual where dummy=&v
  2  ;

D
-
X

SQL> select * from dual where dummy=&v and &v=:v;

D
-
X

SQL> begin &v = 'Z'; end;
  2  /
begin &v = 'Z'; end;
      *
ERROR at line 1:
ORA-06550: line 1, column 7:
PLS-00103: Encountered the symbol "&" when expecting one of the following:

...
Рейтинг: 0 / 0
28.09.2017, 07:32
    #39527411
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Bind variables: & вместо :
Вячеслав ЛюбомудровОно и в 9.2 работаетИ в 7.3 тоже.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
SQL> set serverout on
SQL> declare c number := dbms_sql.open_cursor;
  2      ret varchar2(10) := 'No';
  3      dm varchar2(1) := 'X';
  4      n number;
  5  begin dbms_sql.parse(c, 'select ''Yes'' from dual where dummy='||'&'||'d', dbms_sql.native);
  6        dbms_sql.define_column(c, 1, ret, 10);
  7        dbms_sql.bind_variable(c, ':d', dm); -- '&'||'d' &#242;&#238;&#230;&#229; &#240;&#224;&#225;&#238;&#242;&#224;&#229;&#242;
  8        n := dbms_sql.execute_and_fetch(c);
  9        dbms_sql.column_value(c, 1, ret);
 10        dbms_output.put_line(ret);
 11  end;
 12  /
Yes

PL/SQL procedure successfully completed.

SQL> disc
Disconnected from Oracle7 Server Release 7.3.4.0.0 - Production
With the distributed, replication and parallel query options
PL/SQL Release 2.3.4.0.0 - Production

...
Рейтинг: 0 / 0
28.09.2017, 09:11
    #39527442
Bind variables: & вместо :
В доке по SQL plus:

A substitution variable is preceded by one or two ampersands (&). When SQL*Plus
encounters a substitution variable in a command, SQL*Plus executes the command as
though it contained the value of the substitution variable, rather than the variable
itself.
...
Рейтинг: 0 / 0
28.09.2017, 09:40
    #39527459
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Bind variables: & вместо :
xtenderВячеслав Любомудров,

Ты этот блог нагуглил или ранее как-то прочёл? Я такого прежде не видел...Вроде, как уже обсуждалось мельком
...
Рейтинг: 0 / 0
28.09.2017, 09:54
    #39527480
define off
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Bind variables: & вместо :
Алексей КондыгановВ доке по SQL plusне об этом тема.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Bind variables: & вместо : / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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