我让我们说3个程序使用基本相同的基本查询。有了这个,如果我有查询的更新,我必须同时复制到其他2个程序,以确保它被同步:
即:
PROCEDURE get_something(name IN VARCHAR2, result OUT VARCHAR2){
SELECT *
FROM (SELECT * from multisource)
WHERE col1 = name;
...
}
PROCEDURE get_something2(address IN VARCHAR2, result OUT VARCHAR2){
SELECT *
FROM (SELECT * from multisource)
WHERE col2 = address;
...
}
PROCEDURE get_something3(var IN VARCHAR2, result OUT VARCHAR2){
SELECT *
FROM (SELECT * from multisource)
WHERE col3 = var;
...
}
我正在考虑创建一个返回基本查询表的函数,并从3个过程中调用它。因此,如果我有更新,我将只更新函数下的查询。
即:
FUNCTION get_base()
RETURN table_t
PIPELINED IS
rec record_r;
BEGIN
SELECT * from multisource...
(maybe a pipeleined funcion or cursor here)
RETURN;
END get_base;
然后
PROCEDURE get_something(name IN VARCHAR2, result OUT VARCHAR2){
SELECT *
FROM (SELECT * from table(get_base))
WHERE col1 = name;
...
}
PROCEDURE get_something2(address IN VARCHAR2, result OUT VARCHAR2){
SELECT *
FROM (SELECT * from table(get_base))
WHERE col2 = address;
...
}
PROCEDURE get_something3(var IN VARCHAR2, result OUT VARCHAR2){
SELECT *
FROM (SELECT * from table(get_base))
WHERE col3 = var;
...
}
我的问题是,这是一个好习惯吗?我是否会遇到性能问题?有替代解决方案吗?
答案 0 :(得分:1)
为什么不调整你的逻辑和程序只使用一个这样的选择:
NULL
然后你调用你的程序只传递你想要处理的值,并在其他参数中传递Sub NextInvoice()
Range("D3").Value = Range("D3").Value + 1
Range("B18:H43").ClearContents
End Sub
Sub SaveInvoiceNewName()
Dim NewFN As Variant
'Copy invoice to a new workbook
ActiveSheet.Copy
NewFN = "C:\This PC\Documents\Brewing\Invoices\Invoice " & Range("C5").Value & Range("D3").Value & ".xlsm"
ActiveWorkbook.SaveAs NewFN, FileFormat:=xlOpenXLSMWorkbookMacroEnabled
ActiveWorkbook.Close
NextInvoice
End Sub
。
答案 1 :(得分:1)
表函数通常不是促进DRY(不要重复自己)原则的好方法。视图可能是更好的方法。
表功能齐全,解决了一些有趣的挑战。但它们有点过度使用,可能会导致一些问题:
视图是防止重复SQL的标准方法。
不幸的是,大多数视图实现很糟糕。但是有一些简单的原因可以让观点变得如此丑陋。如果您提前计划,可以避免这些常见问题:
答案 2 :(得分:0)
表函数很棒!一个潜在的性能问题是优化器无法推高col1,col2或col3上的过滤器。
另一个替代方法是让你的表函数接受所有3个参数并仅应用非空参数。
有几种方法可以定义这个TFN查询:
使用OR过滤器。 不要这样做。它不太可能表现良好。
定义3个不同的查询并有条件地执行:IF p_X不为空...
使用UNION ALL连接3个查询并过滤 colX =:p_X和:p_X不为空 只会执行3个中的一个。
动态SQL。 如果经常执行这些查询,您将支付不使用绑定变量的惩罚。 光标共享可能没问题