oraclepl/SQL动态SQL

oraclepl/SQL动态SQL,sql,oracle,plsql,parameters,Sql,Oracle,Plsql,Parameters,我想在表中保存一些参数化sql语句。 例如: select * from table_xy where table_xy.col = :par1; 在Oracle中是否可以从一个名为的参数化sql语句中检测/获取参数。因此,当我试图解析前面的sql语句时,我喜欢用名称检测所有需要的参数(:par1),以便从其他表中按名称选择参数值(:par1) 我希望你知道我的意思。你可以使用regexp来完成这个任务 SELECT regexp_substr('select * from table_xy

我想在表中保存一些参数化sql语句。 例如:

select * from table_xy where table_xy.col = :par1;
Oracle
中是否可以从一个名为的参数化sql语句中检测/获取参数。
因此,当我试图解析前面的sql语句时,我喜欢用名称检测所有需要的参数(
:par1
),以便从其他表中按名称选择参数值(
:par1


我希望你知道我的意思。

你可以使用regexp来完成这个任务

SELECT regexp_substr('select * from table_xy where table_xy.col = :par1;','[:][a-zA-Z0-9_]+') FROM dual;
如果有多个参数,请使用regexp\u substr的三维参数

SELECT regexp_substr('select * from table_xy where table_xy.col = :par1 and table_xy.col2 = :long_par_name2;','[:][a-zA-Z0-9_]+',1,2) FROM dual;

我基本上同意埃德·吉布斯的观点。如果您仍然坚持要这样做,您可能可以通过另一种方式更稳健地执行此操作,即当您知道所有可能参数的完整列表时,您可以执行简单的搜索并替换:

for r in (
  select parameter, value
  from parameter_table
)
loop
  l_query := replace(l_query, ':'||r.parameter, r.value);
end loop;

请注意,这不会处理带引号的字符串/不带引号的数字,因此您应该以可以插入查询的格式存储所有参数值。

请阅读请向我们展示一些DB模式和您尝试过的内容如果这只是学习PL/SQL的一个练习,那么请欣赏。如果是为了生产代码,我建议不要这样做。专注于您的业务逻辑,而不是将SQL语句存储在表中的“框架”。如果你实现了这一点,我敢打赌你会花四分之一的时间来解决它,而不是使用它。如果你必须在数据库中有查询,那么已经有了它们的位置:包、存储过程和函数。我认为这很难,也许你可以用
DBMS\u SQL
包解析SQL并在那里进行分析——但绝对不是PL/SQL初学者的工作。这不会处理括号、运算符和逗号(对于列表中的
)。可能还有其他字符;这些只是第一个想到的字符。