2011-02-11 99 views
1

好吧,所以我知道这个问题已被问到。并且我读的所有东西都是“好的......你可以用动态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; 

此视图然后用于生成晶体报告所需的数据。 问题是我们即将开始在另一种语言中使用这些相同的sql语句。 (我们目前使用的是delphi,但关于另一种语言的工作(但我不知道其他语言是什么))我想在存储过程中创建视图的原因是,因为a)视图是动态的,并基于关闭用户选择的日期范围和b),而不是必须在功能和参数的单一行上放置多种语言的一些相当大的视图(必须由于日期范围选择的变化而实时创建)将需要通过。我读过的很多内容都表示,使用动态SQL创建视图是不好的,但知道它已经是一个专门为用户创建的动态视图,是否有人看到这个问题?我在问,因为我不想让自己陷入困境,因为我不想把自己的头发都抽出来。

+0

这是什么关系型数据库? – 2011-02-11 14:20:52

回答

1

生成视图只是一个好主意,如果它真的代码生成并且通常是相当永久的。因为这是一个架构变化,所以应该将其视为高级技术,并且我总是尝试按照复杂性的顺序使用数据库技术。

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

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

+0

好的,和我一起裸露,因为老实说,我还是这个新手,并且在过去的六个月里一直在努力学习SQl。所以现在基本上我们正在创建一个观点。在飞行中的人是最后一个视图,并没有绑定到任何其他视图参数beign传递始终是日期范围。在我到达这里之前,他们总是被称为sql方面的,你是不是只是在做一个视图来做一个select语句ina函数?也许把它添加到临时表中?有没有人有理由在这里创建一个视图而不是临时表? – Tidmore 2011-02-13 05:56:15

2

我做了Delphi前端和SQL Server后端。为什么使用视图?我总是用一个简单的SELECT创建一个SP,它很好地完成了这项工作。如果经常使用水晶报表,那么通常就是这种情况),我只需创建一个永久表,每次运行SP时都会清空并重新填充该表。简短,甜美,简单。

+2

这是正确的,一种观点是这种类型的要求的错误选择。您可以使用存储过程作为Crystal报表的基础,这对于此类需求更为合适,因为您赢得了;如果其他用户同时尝试这样做,并且放弃了您的视图或清空你的桌子。 – HLGEM 2011-02-11 14:28:58

1

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

  • 性能:DDL语句会作废一些缓存,这是不好的性能
  • 致命的bug:

    你可能会碰到的RISC和问题,如果其他的东西依赖于视图(存储程序,其他视图......)如果您的视图出于某种原因而中断,它们将会中断。

  • 可扩展性:DDL将需要该对象的排他锁。拿到它并阻止其他人可能需要很长时间。
  • 可伸缩性:如果两个用户需要同时以不同方式更改视图,会发生什么情况?
  • 可维护性:当对象变化时,很难理解发生了什么
  • 安全性:有人必须有权更改这些对象,这些对象可能会被误用于做坏事。

在99.9%的人不需要动态创建对象,如果你不在0.1%,你不应该使用它们。

给出您手头任务的描述:为什么不使用带有变量部分的sql语句作为绑定变量并使用它?我看不到在这里需要一个观点。

+0

作为示例,显示的视图是一个相当简单的视图。我提出了完整的观点,并且为什么以这种方式来完成它可能会更有意义。我不知道这是否可能是因为视图是从Delphi创建的,然后Crystal从报表的视图中提取数据?再次,似乎在这里使用一个临时表会更好,因为它不仅需要执行两次,而且需要一次用sql代替视图,然后再从Crystal视图中调用数据。我误解了吗? – Tidmore 2011-02-13 06:07:42