好的,我知道这个问题已经被问到了。我读到的一切都“很好......你可以用动态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创建视图很糟糕,但是知道它已经是一个专门为用户动态创建的动态视图,有没有人看到这个问题?我问,因为我不想让自己陷入困境,因为我不想把自己弄出来,想要把我所有的头发都拉出去。
答案 0 :(得分:2)
我做Delphi前端和SQL Server后端。为什么要使用视图?我总是用一个简单的SELECT创建一个SP,它可以很好地完成工作。如果频繁使用Crystal Report(通常是这种情况),我只需创建一个永久表,每次运行SP时都会清除并重新填充。简短,甜美,简单。
答案 1 :(得分:1)
动态创建视图(或任何数据库对象)就像在运行时操作代码一样。在好的和坏的方面都很强大。
您可能遇到的危险和问题:
在99.9%中,不需要动态创建对象,如果不是0.1%,则不应使用它们。
鉴于您对手头任务的描述:为什么不直接使用带有变量部分的sql语句作为绑定变量并使用它?我不认为这里需要一个视图。
答案 2 :(得分:1)
生成视图只是一个好主意,如果它真的是代码生成并且通常是相当永久的。因为它是模式更改,所以它应该被视为一种高级技术,我总是尝试按照复杂的顺序使用数据库技术。
即。对于某些表/视图设计,如果可以使用视图完成,请尝试使用。如果性能确实需要索引视图,请尝试这样做。或者,可以是计算列或持久计算列。也许是内联表值函数,或多语句表值函数,或者可能是存储过程。所以我只在必要时尝试升级。
在您的情况下,“视图”也可以是SQL Server(至少是DB2)中的内联表值函数,这样的生物就像参数化视图。您还可以直接从大多数报告工具(当然还有大多数语言/数据库库)使用参数化存储过程。