繁体   English   中英

存储过程以创建视图

[英]stored procedure to create a view

好的,我知道这个问题已经被问到了。 我读到的一切都“很好......你可以用动态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创建视图很糟糕,但是知道它已经是一个专门为用户动态创建的动态视图,有没有人看到这个问题? 我问,因为我不想让自己陷入困境,因为我不想把自己弄出来,想要把我所有的头发都拉出去。

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM