给出一些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中内置的某些东西:-)
答案 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上进行测试