有没有办法编写一个SQL存储过程,直到运行时才能知道where子句中包含多少个参数以及那些目标列?
感谢。
答案 0 :(得分:3)
您可以在存储过程中构建动态sql然后执行它。我不建议这样做,但这是一个选择。
如果你选择这条路线,请务必仔细阅读this article。
更新:
免责声明 - 上述文章特定于SQL Server。其中一些可能仍然适用(我不太了解Oracle以某种方式说出来)。
我建议您查看有关动态SQL的Oracle特定信息的this article。
答案 1 :(得分:1)
如果你有很多可以搜索的列,那么构建动态sql语句会更容易但是......你必须担心sql注入
OR
如果您知道将要搜索的列,请为每个列创建一个可选参数,并为其指定默认值null
编辑:在sql server中添加了示例,但可以轻松移植到oracle
CREATE PROCEDURE dbo.test
(
@col1 varchar(50) = null,
@col2 int = null,
@col3 datetime = null
)
AS
SELECT col1, col2, col3
FROM someTable
WHERE (@col1 IS NULL OR col1 = @col1)
AND (@col2 IS NULL OR col2 = @col2)
AND (@col3 IS NULL OR col3 = @col3)