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

dee*_*dee 4 sql oracle variables plsql

有人可以帮助我理解为什么我可以在包中声明硬编码的日期值但不能从查询中指定值吗?

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

Oracle 11g.

这是允许的

create or replace package body PACKAGE_NAME AS

tDate DATE := '2012-05-30';
...procedues follow
Run Code Online (Sandbox Code Playgroud)

这是允许的

create or replace package body PACKAGE_NAME AS

tDate DATE := sysdate;
Run Code Online (Sandbox Code Playgroud)

这是不允许的

create or replace package body PACKAGE_NAME AS

tDate DATE := select MAX(date_) from Table_Name;
Run Code Online (Sandbox Code Playgroud)

我已经尝试了很多方法,最后我很好,它没有工作(我可以在程序本身中根据需要使用它)但我不明白为什么我不能为tDate赋值办法?

具体的错误是"在期待......时遇到符号'SELECT'".

在此先感谢大家的见解

补充一点,我可以通过存储过程中的查询获得变量值,但相同的过程似乎不适用于包体.

PROCEDURE Proc_Name IS
tDate Date;
BEGIN
SELECT MAX(date_) into tDate from Table_Name;
Run Code Online (Sandbox Code Playgroud)

Bob*_*ica 9

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

CREATE OR REPLACE PACKAGE TEST_PKG IS
  tDate  DATE;
END TEST_PKG;
Run Code Online (Sandbox Code Playgroud)

这里我们创建了一个只包含一个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;
Run Code Online (Sandbox Code Playgroud)

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

begin
  -- Test statements here
  DBMS_OUTPUT.PUT_LINE('TEST_PKG.tDate = ' || TEST_PKG.tDate);
end;
Run Code Online (Sandbox Code Playgroud)

它应该打印当前日期.

分享和享受.