pl/sql 存储过程从日期等于存储过程参数的表中进行选择

Posted

技术标签:

【中文标题】pl/sql 存储过程从日期等于存储过程参数的表中进行选择【英文标题】:pl/sql stored procedure to select from a table where date is equal to stored procedure parameter 【发布时间】:2020-02-12 13:41:05 【问题描述】:

我是 PL/SQL 和 oracle 的新手,我正在针对 Oracle 12C 数据库使用 SQL developer 19。 正如我以前在 T-SQL 中所做的那样,我要做的就是从日期字段值介于两个存储过程 ate 参数之间的表中选择一些数据;在我使用的存储过程下面给我一个错误,说我必须“SELECT INTO”?

create or replace PROCEDURE GET_DMR_HALO_VALUES ( START_DATE IN DATE , END_DATE IN DATE ) 
AS 

BEGIN    
SELECT 
HALO_RECORD_ID ,
ASSET_ID ,
ASSET_NAME ,
NUMERIC_VALUE ,
IS_ENABLED ,
ADDED_BY ,
VALUE_DATE ,
NOTES ,
DATE_ADDED  

FROM halo_inputs

WHERE trunc(value_date) BETWEEN START_DATE and END_DATE;

END GET_DMR_HALO_VALUES;

那么我还有另一个问题......假设上述工作我试图通过调用SQL开发人员中的存储过程来查看返回的表数据,如下所示

  DEFINE START_DATE date := TO_DATE('2019-02-12','YYYY-DD-MM');
  DEFINE END_DATE date := TO_DATE('2019-02-12','YYYY-DD-MM');

   exec GET_DMR_HALO_VALUES(:START_DATE, :END_DATE );

像上面这样调用 SP 是否正确?

更新

看了这个stack-over article 我将存储过程更改如下

create or replace PROCEDURE GET_DMR_HALO_VALUES ( START_DATE IN DATE , END_DATE IN DATE ) 
AS 
c1 sys_refcursor;
BEGIN
open c1 for
SELECT 
HALO_RECORD_ID ,
ASSET_ID ,
ASSET_NAME ,
NUMERIC_VALUE ,
IS_ENABLED ,
ADDED_BY ,
VALUE_DATE ,
NOTES ,
DATE_ADDED  

FROM halo_inputs

WHERE trunc(value_date) BETWEEN START_DATE and END_DATE;

dbms_sql.return_result(c1);

END;

但是游标是 Oracle 中获取表数据的唯一方法吗?

更新 2 我还更改了执行查询如下

DECLARE 
START_DATE date := TO_DATE('12-02-20','DD-MM-YY');
END_DATE date := TO_DATE('12-02-20','DD-MM-YY');

BEGIN
    GET_DMR_HALO_VALUES(START_DATE,END_DATE );
END;

它可以工作,但是我如何让 SQL 开发人员在网格视图中而不是纯文本中显示数据?

【问题讨论】:

【参考方案1】:

让这个查询在数据网格中返回数据的最简单的选择是......好吧,在存储过程之外运行它。程序是不错,但不是那么好做你想做的事。

返回某些东西时,函数可能是更好的选择。例如:

先创建它:

SQL> create or replace FUNCTION f_test (par_deptno in number)
  2    return sys_refcursor
  3  is
  4    l_rc sys_refcursor;
  5  begin
  6    open l_rc for
  7      select empno, ename, job, sal
  8      from emp
  9      where deptno = par_deptno;
 10    return l_rc;
 11  end;
 12  /

Function created.

然后调用它:

SQL> select f_test(10) from dual;

F_TEST(10)
--------------------
CURSOR STATEMENT : 1

CURSOR STATEMENT : 1

     EMPNO ENAME      JOB              SAL
---------- ---------- --------- ----------
      7782 CLARK      MANAGER         2450
      7839 KING       PRESIDENT       5000
      7934 MILLER     CLERK           1300


SQL>

在 SQL Developer 中,您将运行最后一条语句 (select f_test(10) from dual;)作为脚本(F9 键盘快捷键),然后它会很好地显示结果 (如我上面的示例所示,虽然它是 SQL Plus 命令行工具输出)。不过,它仍然不会在数据网格中。

【讨论】:

谢谢,唯一的区别是在sql developer中我调用这样的函数 DECLARE ST_DATE DATE; EN_DATE 日期; v_Return SYS_REFCURSOR;开始 ST_DATE := to_date('2020-02-12','yyyy-MM-dd'); EN_DATE := to_date('2020-02-12','yyyy-MM-dd'); v_Return := FUNC_GET_DMR_HALO_VALUES(START_DATE => ST_DATE,END_DATE => EN_DATE);结束; 不客气。有几种方法可以做到这一点。你的代码,稍微简化了,可能是select func_get_dmr_halo_values(date '2020-02-12', date '2020-02-12') from dual。这只是为了提供信息;我很高兴你成功了。 我一直看到这个“双重”,但我不知道这是什么

以上是关于pl/sql 存储过程从日期等于存储过程参数的表中进行选择的主要内容,如果未能解决你的问题,请参考以下文章

PL SQL - 使用动态 SQL 生成删除语句

Oracle 12 PL/SQL 在触发器中检索存储过程名称

PL/SQL 存储过程错误

ORACLE PL/SQL:使用多个参数调用存储过程函数(DML 查询)

从 shell 脚本调用 PL/SQL 存储过程并捕获 out 参数

如何修复存储过程 Oracle PL/SQL 的错误?