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


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

Когда такое появилось? sqlplus точно это не поддерживает - я проверил. Это только некоторые драйвера поддерживают?
Запрос этот из софтины, которая юзает DOA
...
Рейтинг: 0 / 0
Bind variables: & вместо :
    #39527236
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Причем разработчик утверждает, что в самой софтине это запрос написан через ":", но драйвер сам его так преобразовывает...
...
Рейтинг: 0 / 0
Bind variables: & вместо :
    #39527240
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у нас четко видны двоеточия
& <= эту хрень никогда не видел
смотрю обычно v$sql_text_with_new_lines
...
Рейтинг: 0 / 0
Bind variables: & вместо :
    #39527243
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
и это единственный такой запрос в базе сейчас
...
Рейтинг: 0 / 0
Bind variables: & вместо :
    #39527245
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Код: 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
Bind variables: & вместо :
    #39527246
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
и на 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
Bind variables: & вместо :
    #39527259
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Bind variables: & вместо :
    #39527263
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
env,

это не относится к dynamic SQL, это вообще общий placeholder...
В доке есть только :
https://docs.oracle.com/database/122/SQLRF/Placeholder-Expressions.htm#SQLRF52091
...
Рейтинг: 0 / 0
Bind variables: & вместо :
    #39527383
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Bind variables: & вместо :
    #39527388
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Вячеслав Любомудров,

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

а к 9.2 подключался каким sqlplus? тоже от 9.2 с его же клиентом?
...
Рейтинг: 0 / 0
Bind variables: & вместо :
    #39527394
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
забавно, это работает только для 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
Bind variables: & вместо :
    #39527411
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ЛюбомудровОно и в 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
Bind variables: & вместо :
    #39527442
В доке по 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
Bind variables: & вместо :
    #39527459
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderВячеслав Любомудров,

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


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