Oracle PL/SQL 计算年龄

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle PL/SQL 计算年龄相关的知识,希望对你有一定的参考价值。

参考技术A 根据出生日期查询年龄用的还挺多的。
简单分析一下,加入一个孩子五岁半了,那习惯认为他还是5岁。
用Oracle提供的months_between()函数,先获取出生日期和当前日期的月数,然后除以12向下取整:

使用的时候,将时间段替换成出生日期对应的字段即可。

如果,计算年龄用的次数非常多,最好写成自定义函数。

使用两个过程用 OUT 和 IN 参数进行简单计算,PL/SQL Oracle

【中文标题】使用两个过程用 OUT 和 IN 参数进行简单计算,PL/SQL Oracle【英文标题】:Using two procedures to make simple calculations with OUT and IN parameters, PL/SQL Oracle 【发布时间】:2016-03-06 15:38:51 【问题描述】:

我们被指派用 Oracle 的 11g PL/SQL 语言创建两个用于进行简单计算的过程。 赋值如下:

创建两个过程,其中第一个 (a) 将接收两个带有 IN 参数的值,然后将值发送到过程 b,该过程将计算并显示结果。

我浏览了网络并阅读了有关此的书籍,但我无法让它发挥作用。我经常遇到错误代码,我无法弄清楚我做错了什么。我什至不确定这是否可行,但很难找到答案。

这是我的代码:

SET serveroutput ON

CREATE OR REPLACE PROCEDURE proc_a
(number1 IN NUMBER, number2 IN NUMBER)
AS
BEGIN
  proc_b(number1, number2);
END;
/

CREATE OR REPLACE PROCEDURE proc_b
(number1_proc_a IN OUT NUMBER, number2_proc_a IN OUT NUMBER, result_proc_a OUT NUMBER)
AS
result_proc_a number;
BEGIN 
  result_proc_a := tal1_proc_a + tal2_proc_a;
  dbms_output.put_line('Result: ' || result_proc_a);
END;
/

CALL proc_a(4, 6);

如果有人知道为什么它不起作用,我将不胜感激!我遇到的错误消息是:

PL/SQL: Statement ignored. Object proc_a is invalid.

还有:

Package or function %s is in an invalid state

编辑: 在用户 Sagi 的帮助下,我得到了它的工作!谢谢:)

【问题讨论】:

将输入变量声明为 IN OUT 可以吗?另外,看起来您在开始时将 result_proc_a 声明为 out,那么您为什么要再次定义它呢? 哦,天哪...你是对的。解决了我的问题,哈哈。我一定是被所有的代码弄瞎了!谢谢,它现在按预期工作! :) 【参考方案1】:

需要注意的几点:

proc_b 中有一个重复的变量名 result_proc_a:它被声明为第三个参数和局部变量。 您应该删除局部变量声明。

最好以相反的顺序声明过程。 proc_a依赖于proc_b,所以先创建proc_b。这样 proc_a 在创建后就不会处于无效状态。

虽然参数可以是IN OUT,但是proc_b的前两个参数不需要是OUT。通过删除OUT,您可以使用文字数字调用proc_b

根据您使用的环境,执行普通的call 可能不起作用。在这种情况下,请使用 begin end 块,它始终有效:

    BEGIN
        proc_a(4, 6);
    END;
    /

我看到你的问题已经解决了。我只是留下这个答案以供参考。

【讨论】:

【参考方案2】:

试试这个。希望下面的 sn-p 对您有所帮助。我在这里只建议一件事 如果计算量很大,请使用 pls_integer 代替 NUMBER 参与程序。

SET serveroutput ON

CREATE OR REPLACE PROCEDURE proc_a
(number1 IN OUT PLS_INTEGER, 
number2 IN OUT PLS_INTEGER
)
AS
resl_proc_b PLS_INTEGER;
BEGIN
  proc_b(number1, number2,resl_proc_b);
END;
/

CREATE OR REPLACE PROCEDURE proc_b(
    number1_proc_a IN OUT PLS_INTEGER,
    number2_proc_a IN OUT PLS_INTEGER,
    result_proc_a OUT PLS_INTEGER)
AS
  tal1_proc_a PLS_INTEGER:=0;
  tal2_proc_a PLS_INTEGER:=0;
BEGIN
  result_proc_a := tal1_proc_a + tal2_proc_a;
  dbms_output.put_line('Result: ' || result_proc_a);
END;
/

【讨论】:

以上是关于Oracle PL/SQL 计算年龄的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL 程序来计算年龄以及你的生日年份是不是是闰年[关闭]

PL/SQL程序在哪里执行,困惑,说的详细些……谢谢

如何计算oracle pl/sql中数字的位数?

使用两个过程用 OUT 和 IN 参数进行简单计算,PL/SQL Oracle

oracle 关于年龄计算问题?

SQL 非过程性语言 T-SQL PL/SQL 过程性语言;区别是啥?