ITPub博客

首页 > 数据库 > Oracle > [20250418]绑定变量太多的限制.txt

[20250418]绑定变量太多的限制.txt

原创 Oracle 作者:lfree 时间:2025-04-18 20:20:28 0 删除 编辑

[20250418]绑定变量太多的限制.txt

--//看看最多1条sql语句能有多少绑定变量。

1.环境:
SCOTT@book01p> @ ver2
==============================
PORT_STRING                   : x86_64/Linux 2.4.xx
VERSION                       : 21.0.0.0.0
BANNER                        : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
BANNER_FULL                   : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0
BANNER_LEGACY                 : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
CON_ID                        : 0
PL/SQL procedure successfully completed.

2.建立测试环境:

create table t as select * from all_objects;
create unique index i_t_object_id on t(object_id);
--//分析略。

$ cat a.txt
set pagesize 0
set head off
set feedback off
set verify off
set timing off
spool b1.txt
select 'set termout off'  from dual;
select 'variable b'||to_char(level)||' number;'  from dual connect by level<=&1;
select 'begin'  from dual;
select ':b'||to_char(level)||' :='|| to_char(level)||';'  from dual connect by level<=&1;
select 'end;'  from dual;
select '/' from dual ;
select 'set termout on' txt from dual;
spool off

spool b2.txt
--select 'set timing on' txt from dual;
select 'select count(data_object_id) from t where (1,object_id) in (' txt from dual ;
select '(1,:b'||to_char(level)||'),' txt from dual connect by level<=&&1 -1 ;
select '(1,:b'||to_char(&&1)||'));' txt from dual ;
--select 'set timing off' txt from dual;
spool off

set pagesize 9999
set head on
set feedback on

3.测试1,begin与end之间只能赋值32767个变量:
SCOTT@book01p> @ a.txt 32768
--//输出略。
--//编辑b1.txt,删除开头的set termout off, set termout on。

SCOTT@book01p> @ b1.txt
:b829 :=829;
        *
ERROR at line 830:
ORA-06550: line 32770, column 1:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PLS-00123: program too large (codegen operands)

$ sed -n "32770p" b1.txt
:b1 :=1;

--//删除:b32768 :=32768;一行,再测试。

SCOTT@book01p> @ b1.txt
PL/SQL procedure successfully completed.

--//说明再begin..end之间可以定义32767个绑定变量。

4.测试2,一条sql语句能出现多少绑定变量:

SCOTT@book01p> @ a.txt 65536
--//输出略。
--//编辑b1.txt,删除开头的set termout off, set termout on,并且适当编辑满足前面begin..end之间可以定义32767个绑定变量的
--//限制。

$ egrep -C 1 --no-group-separator "begin|end" b1.txt
variable b65536 number;
begin
:b1 :=1;
:b32767 :=32767;
end;
/
begin
:b32768 :=32768;
:b65534 :=65534;
end;
/
begin
:b65535 :=65535;
:b65536 :=65536;
end;
/


SCOTT@book01p> @ b1.txt
PL/SQL procedure successfully completed.
PL/SQL procedure successfully completed.
PL/SQL procedure successfully completed.


SCOTT@book01p> @ b2.txt
select count(data_object_id) from t where (1,object_id) in (
                                                           *
ERROR at line 1:
ORA-00920: invalid relational operator

$ oerr ora 00920
00920, 00000, "invalid relational operator"
// *Cause:
// *Action:

--//不知道是否超过集合的限制.

--//编辑b2.txt 注解其中一行,看看情况的变化:

$ head -2 b2.txt ;tail -3 b2.txt
select count(data_object_id) from t where (1,object_id) in (
(1,:b1),
(1,:b65534),
--(1,:b65535),
(1,:b65536));

SCOTT@book01p> @ b2.txt
COUNT(DATA_OBJECT_ID)
---------------------
                 3970
--//可以发现sql语句里面存在65535个绑定变量,超过65536报错。
--//编辑b2.txt,再测试看看:

$ head -2 b2.txt ;tail -5 b2.txt
select count(data_object_id) from t where (1,object_id) in (
(1,:b1),
(1,:b65534))
or
(1,object_id) in (
(1,:b65535),
(1,:b65536));

SCOTT@book01p> @ b2.txt
select count(data_object_id) from t where (1,object_id) in (
*
ERROR at line 1:
ORA-00920: invalid relational operator
--//说明不是超过集合的限制.

--//可以看出一条sql语句里面存在65535个绑定变量。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/267265/viewspace-3081809/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
熟悉oracle相关技术,擅长sql优化,rman备份与恢复,熟悉linux shell编程。

注册时间:2008-01-03

  • 博文量
    4006
  • 访问量
    7969783