如何在Oracle中的包体中声明变量?

时间:2012-06-01 14:04:47

标签: sql oracle variables plsql

有人可以帮助我理解为什么我可以在包中声明硬编码的日期值,但不能将查询中的值设为对象吗?

我已经看过许多示例(包括参考书),它们显示了硬编码值的声明,但是我无法找到通过查询将值赋值给变量的示例。

Oracle 11g。

这是允许的

create or replace package body PACKAGE_NAME AS

tDate DATE := '2012-05-30';
...procedues follow

这是允许的

create or replace package body PACKAGE_NAME AS

tDate DATE := sysdate;

这是不允许的

create or replace package body PACKAGE_NAME AS

tDate DATE := select MAX(date_) from Table_Name;

我已经尝试了很多方法,最后我很好用它不起作用(我可以根据程序本身的需要使用它)但我不明白为什么我不能分配一个值这样做?

具体错误是“期待......时遇到符号'SELECT'。”。

提前感谢所有人的见解

补充说我可以通过存储过程中的查询获取变量值,但是相同的过程似乎不适用于包体。

PROCEDURE Proc_Name IS
tDate Date;
BEGIN
SELECT MAX(date_) into tDate from Table_Name;

2 个答案:

答案 0 :(得分:9)

您需要在包体中创建包初始化块。这是一个相对晦涩的PL / SQL包传说,但它可以使用。这是一个例子:

CREATE OR REPLACE PACKAGE TEST_PKG IS
  tDate  DATE;
END TEST_PKG;

这里我们创建了一个只包含一个DATE变量的包规范。现在我们将创建一个简单的主体,使用SELECT语句初始化该变量:

CREATE OR REPLACE PACKAGE BODY TEST_PKG IS
-- Following BEGIN-END block is the package initialization block

BEGIN
  SELECT SYSDATE
    INTO tDATE
    FROM DUAL;
EXCEPTION  -- you can have exception handlers in your initialization block
  WHEN OTHERS THEN
    NULL;  -- pointless here, but this is just an example
    RAISE;
END TEST_PKG;

现在,如果执行以下操作:

begin
  -- Test statements here
  DBMS_OUTPUT.PUT_LINE('TEST_PKG.tDate = ' || TEST_PKG.tDate);
end;

它应该打印当前日期。

分享并享受。

答案 1 :(得分:1)

直接选择变量时,您需要使用INTO

select MAX(date_) 
INTO tDate
from Table_Name;