AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 128064
Accepted
daniel9x
daniel9x
Asked: 2016-02-03 12:49:03 +0800 CST2016-02-03 12:49:03 +0800 CST 2016-02-03 12:49:03 +0800 CST

Select 子句中的函数是否评估 where 子句之前传入的列?

  • 772

我有一个简单的 select 语句,它使用一个(不是那么)简单的函数。为了这个问题的目的,我将尽力简化和展示我的能力。

            select submission_identifier,
                   submitted_by_person_id,
                   submission_date,
                   form_version_date_time,
                   form_id,
                   func_get_open_days_2(
                     submitted_by_person_id, 
                     submission_date, 
                     form_version_date_time, 
                     form_id)` open_days
            from form_submission
            where submission_identifier = 2070;

submission_identifier 是 form_submission 表的主键,因此自然地,此查询返回一个结果。

如您所见,该函数有 4 个参数。我假设这些参数中的值是计算 where 子句后的查询结果。这是该函数的一个片段。

create or replace function        func_get_Open_Days_2
   ( SUBMITTED_BY_PERSON_ID in number,
  SUBMISSION_DATE in date,
  FORM_VERSION_DATE_TIME in timestamp,
  FORM_ID in number
   )
RETURN number

IS
   n1 number:=0;
   n2 number:=0;

   cursor records is
      SELECT 
        SUBMITTED_BY_PERSON_ID,
        SUBMISSION_DATE,
        FORM_ID,
        FORM_VERSION_DATE_TIME,
        AUDIT_DATE_TIME,
        STATUS_DATE,
        SUBMISSION_STATUS_CODE,
        CREATE_USER_ID
      from form_state_audit_trail t
      where
        t.submitted_by_person_id = SUBMITTED_BY_PERSON_ID and
        t.form_id = FORM_ID and
        t.submission_date = SUBMISSION_DATE and
        t.form_version_date_time = FORM_VERSION_DATE_TIME and 
        t.submission_status_code NOT IN (3469, 3462);
        order by t.status_date asc;

   rec records%ROWTYPE;

BEGIN

dbms_output.put_line('submitted by person id ='||submitted_by_person_id);
dbms_output.put_line('form id ='||form_id);
dbms_output.put_line('submission date ='||submission_date);
dbms_output.put_line('form_version_date_time ='||form_version_date_time);

  -- go through all the durations in audit_trail table
  FOR rec in records
  LOOP

我已经尝试对返回值进行硬编码并将它们放入此游标选择查询中。我收到 1 个结果。

这向我建议“记录”数组或列表应该只有 1 个结果。但是,我现在得到了很多结果。正在返回“记录”,这表明没有使用我期望的 4 个值/结果评估 where 子句我不确定我做错了什么。“dbms_output.put_line”是 BEGIN,但在 LOOP 确认预期值到达函数之前。

oracle functions
  • 1 1 个回答
  • 118 Views

1 个回答

  • Voted
  1. Best Answer
    Joe DeRose
    2016-02-03T13:12:52+08:002016-02-03T13:12:52+08:00

    函数WHERE子句中的引用与其子句中的同名列进行比较SELECT,而不是参数列表。尝试按如下方式更改它(注意ARG_在子句中的参数名称和谓词中添加了WHERE):

    create or replace function        func_get_Open_Days_2
       ( ARG_SUBMITTED_BY_PERSON_ID in number,
      ARG_SUBMISSION_DATE in date,
      ARG_FORM_VERSION_DATE_TIME in timestamp,
      ARG_FORM_ID in number
       )
    RETURN number
    
    IS
       n1 number:=0;
       n2 number:=0;
    
       cursor records is
          SELECT 
            SUBMITTED_BY_PERSON_ID,
            SUBMISSION_DATE,
            FORM_ID,
            FORM_VERSION_DATE_TIME,
            AUDIT_DATE_TIME,
            STATUS_DATE,
            SUBMISSION_STATUS_CODE,
            CREATE_USER_ID
          from form_state_audit_trail t
          where
            t.submitted_by_person_id = ARG_SUBMITTED_BY_PERSON_ID and
            t.form_id = ARG_FORM_ID and
            t.submission_date = ARG_SUBMISSION_DATE and
            t.form_version_date_time = ARG_FORM_VERSION_DATE_TIME and 
            t.submission_status_code NOT IN (3469, 3462);
          order by t.status_date asc;
    
    • 1

相关问题

  • Oracle 中的数据库备份 - 导出数据库还是使用其他工具?

  • ORDER BY 使用文本列的自定义优先级

  • 舒服的sqlplus界面?[关闭]

  • 如何在数据库中找到最新的 SQL 语句?

  • 如何使用正则表达式查询名称?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve