确定包含SQL的字符串中的绑定变量的数量

时间:2018-08-26 11:09:27

标签: sql oracle plsql oracle11g

给出一些SQL字符串,是否有办法找出内部的绑定变量如何?例如:

update t set a = :a /* :a is a bind variable */ 
           , b = ':b' -- :b is not a bind variable, as it's inside a string

以字符串形式

'update t set a = :a /* :a is a bind variable */ , b = '':b'' -- :b is not a bind variable, as it''s inside a string'

为了了解内部有一个绑定变量,是否可以在此字符串上应用某种描述方法?

首先,我考虑过在字符串上使用一些regexp_replace来删除注释和字符串内容,但这几乎是不可能的,因为冒号可以出现在注释和字符串中,如上所示,但是字符串也可以包含{{1} },/**/。所以我拒绝了这个主意。

需要递归才能正确执行此检测。但是,而不是编写一种递归解析器查询,我希望可以立即使用Oracle中内置的某些东西:-)

1 个答案:

答案 0 :(得分:0)

您可以使用REGEXP_COUNT来计算替换了注释的字符串中的绑定变量。

例如:

SELECT sqlcode,
REGEXP_COUNT(
 REGEXP_REPLACE(
   REGEXP_REPLACE(
    sqlcode,
    '[/][*].*[*][/]','',1,0,'n'),
    '--.*$','',1,0,'m'),
    '[= ]:\w+', 1, 'i') as TotalBindVars
FROM test;

在Sql Fiddle here上进行测试