存储过程以创建视图

时间:2011-02-11 14:12:31

标签: sql view dynamic-sql procedure

好的,我知道这个问题已经被问到了。我读到的一切都“很好......你可以用动态DSL来做,但不要这样做”我的问题是为什么。我还是新手,所以我正在学习如此忍受我,但这就是我正在做的事情。 我想使用存储过程来创建动态视图(但不是临时表)视图有两个日期用于建立开始和结束日期。它看起来像这样:

create or replace view MyView as
SELECT
   A.COLUMN_A
   FUNCTION1(to_date('2/10/2011','MM/DD/YYYY') TOTAL1,
   FUNCTION2(to_date('2/15/2011','MM/DD/YYYY') TOTAL2
FROM TABLE_A A;

然后,此视图用于生成Crystal中报表所需的数据。 问题是我们即将开始在另一种语言中使用这些相同的sql语句。 (我们目前正在使用delphi,但是关于使用另一种语言(但我不知道另一种语言是什么))我想在存储过程中创建视图的原因是,因为a)视图是动态的,并且基于用户选择的日期范围和b)而不是必须在多行语言中放入一些相当大的视图(由于更改日期范围选择而必须在运行中创建),而不是在函数和参数的单行上需要通过。我读到的很多内容都说使用动态SQL创建视图很糟糕,但是知道它已经是一个专门为用户动态创建的动态视图,有没有人看到这个问题?我问,因为我不想让自己陷入困境,因为我不想把自己弄出来,想要把我所有的头发都拉出去。

3 个答案:

答案 0 :(得分:2)

我做Delphi前端和SQL Server后端。为什么要使用视图?我总是用一个简单的SELECT创建一个SP,它可以很好地完成工作。如果频繁使用Crystal Report(通常是这种情况),我只需创建一个永久表,每次运行SP时都会清除并重新填充。简短,甜美,简单。

答案 1 :(得分:1)

动态创建视图(或任何数据库对象)就像在运行时操作代码一样。在好的和坏的方面都很强大。

您可能遇到的危险和问题:

  • 性能:DDL语句会使某些缓存失效,这对性能不利
  • 致命错误:如果其他内容依赖于视图(存储过程,其他视图......),如果您的视图因某种原因而中断,它们将会中断。
  • 可伸缩性:DDL需要对该对象进行独占锁定。可能需要很长时间才能获得并阻止其他人。
  • 可扩展性:如果两个用户需要同时以不同方式更改视图会发生什么?
  • 可维护性:当对象随时更改时,很难理解发生了什么
  • 安全:有人必须有权更改这些物品,这些物品可能会因为做坏事而被滥用。

在99.9%中,不需要动态创建对象,如果不是0.1%,则不应使用它们。

鉴于您对手头任务的描述:为什么不直接使用带有变量部分的sql语句作为绑定变量并使用它?我不认为这里需要一个视图。

答案 2 :(得分:1)

生成视图只是一个好主意,如果它真的是代码生成并且通常是相当永久的。因为它是模式更改,所以它应该被视为一种高级技术,我总是尝试按照复杂的顺序使用数据库技术。

即。对于某些表/视图设计,如果可以使用视图完成,请尝试使用。如果性能确实需要索引视图,请尝试这样做。或者,可以是计算列或持久计算列。也许是内联表值函数,或多语句表值函数,或者可能是存储过程。所以我只在必要时尝试升级。

在您的情况下,“视图”也可以是SQL Server(至少是DB2)中的内联表值函数,这样的生物就像参数化视图。您还可以直接从大多数报告工具(当然还有大多数语言/数据库库)使用参数化存储过程。