【问题标题】:Oracle 10g Create a View passing in a parameterOracle 10g 创建视图传入参数
【发布时间】:2017-10-30 19:59:20
【问题描述】:

我一直在搜索,但我无法找到一个令人满意的解决方案,我可以将参数传递给视图。

我想要做的是调用保存在 Oracle 10g 中的视图,通过 NHibernate 传递日期,这听起来很简单,但我读到传递参数到视图并非如此。所以,除非我被误导了,否则有人可以告诉我这是否可能以及如何进行;还是我应该将其作为存储过程来执行?

CREATE OR REPLACE aView AS VIEW
 SELECT col1,
        col2,
        col3,
 FROM someTable
 WHERE col4 <= TO_DATE('somePassInDate', 'dd/mm/yyyy');

以上是我想要运行的那种查询。我没有休眠来创建这个查询。

谢谢

【问题讨论】:

  • 你能分享一些你正在努力实现的例子
  • 立即查找更新
  • 为什么不从视图中选择 时简单地应用该条件?
  • 流水线表函数存在问题,因为它们效率低下并且可能需要一段时间才能返回任何行。此查询是内务查询的一部分,每天晚上它将返回数千行。这就是为什么我把它从 nhibernate 中拿走,因为它效率低下

标签: oracle oracle10g


【解决方案1】:

流水线表函数存在问题 效率低下,可能需要一段时间才能返回任何行。这个查询是 家政查询的一部分,每晚都会返回 数千行。这就是为什么我把它从 nhibernate 中拿走的原因 效率低下

这是错误的。流水线函数比table functions 更高效。原因是:

流水线允许行按原样从表函数中传递出去 生产,而不是等待生产整个系列 在返回结果之前。结果是减少了 生产第一行所需的时间和减少 表函数消耗的内存总量。

您可以在此处阅读详细示例Pipelined Functions

但不确定您的需求是什么,但您可以创建一个动态块或程序来满足您的需求。在执行以下块时,它会提示输入日期。

DECLARE
   v_sql    VARCHAR2 (1000);
   v_date   DATE := :v_date;
BEGIN
   v_sql := q'[CREATE OR REPLACE aView AS VIEW
          SELECT col1,
          col2,
           col3,
          FROM someTable
          WHERE col4 <= TO_DATE(':somePassInDate', 'dd/mm/yyyy')]';

   EXECUTE IMMEDIATE v_sql USING v_date;
END;

【讨论】:

    【解决方案2】:

    “自定义”via 输出的唯一方法是使用系统上下文。它类似于 SQL 引擎中的全局变量。

    https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_5002.htm

    CREATE OR REPLACE aView AS VIEW
     SELECT col1,
            col2,
            col3,
     FROM someTable
     WHERE col4 <= TO_DATE(SYS_CONTEXT ('MY_CONTEXT', 'MY_CTX_VARIABLE') , 'dd/mm/yyyy');
    

    在哪里可以找到上下文变量的 HOWTO 设置值:

    https://dba.stackexchange.com/questions/114252/oracle-how-do-i-set-a-context-variable

    恕我直言,不值得尝试,您需要授予“创建任何系统上下文”的权限。如果你使用 hibernate,你不应该将它与高级 Oracle 的东西结合起来。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-27
      • 1970-01-01
      • 2011-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多