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 创建视图很糟糕,但知道它已经是专门为动态用户创建的动态视图,有人看到这个问题吗?我之所以这样问,是因为我不想让自己陷入某种我无法摆脱的事情,因为我不想把我所有的头发都拔掉。

4

3 回答 3

2

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

于 2011-02-11T14:19:21.470 回答
1

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

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

  • 性能:DDL 语句会使你的一些缓存失效,这对性能不利
  • 致命错误:如果其他东西依赖于视图(存储过程,其他视图......),如果您的视图由于某种原因或其他原因而中断,它们将中断。
  • 可扩展性:DDL 将需要对该对象的排他锁。可能需要很长时间才能获得它并在持有它的同时阻止其他所有人。
  • 可扩展性:如果两个用户需要同时以不同的方式改变视图会发生什么?
  • 可维护性:当对象动态变化时,很难理解发生了什么
  • 安全性:必须有人有权更改这些对象,这些对象可能会被滥用于做坏事。

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

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

于 2011-02-11T14:31:43.580 回答
1

仅当视图确实是代码生成并且通常相当永久时,生成视图才是一个好主意。因为它是一种模式更改,所以它应该被视为一种高级技术,并且我总是尝试按照复杂程度来使用数据库技术。

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

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

于 2011-02-11T14:40:33.723 回答