【问题标题】:Passing Value from Procedure to Select Statement将值从过程传递到 Select 语句
【发布时间】:2011-07-31 22:38:16
【问题描述】:

我想创建一个过程,它从员工表中返回最大日期,然后允许我在选择语句中再次调用最大日期。

谢谢。

注意:我将在许多选择语句中使用max_date_PARAM 进行报告。

CREATE OR REPLACE PROCEDURE max_date_proc (max_date_PARAM out DATE) 
IS
BEGIN
    SELECT  max(start_date)  INTO max_date_PARAM
     FROM employee 
   END max_date_proc;
/
select * from benefits where claim > = max_date_PARAM;

【问题讨论】:

  • 如何从索赔中选择*> =(从员工中选择最大值(开始日期));哦,等等,贾斯汀打败了我;)

标签: oracle parameters plsql procedure


【解决方案1】:

如果您在 SQL*Plus(或者我认为是 SQL Developer,不确定其他)中运行您的语句,您可以使用绑定变量:

variable l_max_date date;
exec max_date_proc(:l_max_date);
select * from benefits where claim >= :l_max_date;

同一个函数,这里更适合;使用贾斯汀的:

variable l_max_date date;
exec :l_max_date := get_max_start_date();
select * from benefits where claim >= :l_max_date;

当然,如果您只使用一次结果,那么将其作为函数或过程没有多大意义,但我假设您希望多次重复使用相同的值,而不是每次都重新计算。

另一种选择,使用 SQL*Plus'column handling 定义变量:

column max_date new_value l_max_date noprint;
select max(start_date) max_date from employee;
select * from benefits where claim >= &l_max_date;

【讨论】:

    【解决方案2】:

    如果你创建了一个函数

    CREATE OR REPLACE FUNCTION get_max_start_date
      RETURN DATE
    IS
      l_max_date DATE;
    BEGIN
      SELECT MAX(start_date)
        INTO l_max_date
        FROM employee;
      RETURN l_max_date;
    END get_max_start_date;
    

    那你就可以查询了

    SELECT *
      FROM benefits
     WHERE claim >= get_max_start_date();
    

    当然,你也可以在没有函数的情况下做到这一点

    SELECT * 
      FROM benefits
     WHERE claim >= (SELECT MAX(start_date)
                       FROM employee)
    

    【讨论】:

    • 两者都很好用!谢谢你。我最初被告知要从与我一起工作的人那里创建一个程序。感谢您为我指明正确的方向!
    【解决方案3】:

    您应该使用函数而不是过程。 http://psoug.org/reference/functions.html

    【讨论】:

    • 谢谢,如果我使用函数而不是过程。如何告诉 Oracle 保留该值,然后将其传递给 SQL 语句。谢谢你的建议。
    猜你喜欢
    • 2013-03-16
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    • 2016-02-10
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多