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 存储过程从日期等于存储过程参数的表中进行选择的主要内容,如果未能解决你的问题,请参考以下文章
Oracle 12 PL/SQL 在触发器中检索存储过程名称
ORACLE PL/SQL:使用多个参数调用存储过程函数(DML 查询)