5

有人可以帮我理解为什么我可以在包中声明硬编码的日期值但不能从查询中分配值吗?我已经看到了许多显示硬编码值声明的示例(包括参考书),但我无法找到通过查询将值分配给变量的示例。

这是允许的:

create or replace package body PACKAGE_NAME AS
    tDate DATE := '2012-05-30';
    -- ...procedures 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;

我已经尝试了多种方法,但我可以接受它不起作用 - 我可以根据需要在程序本身中使用它。但我想知道为什么我不能用tDate这种方式赋值?具体错误是:

期待...时遇到符号'SELECT'。

添加我可以通过存储过程中的查询获得分配的变量值,但相同的过程似乎不适用于包体。

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

2 回答 2

11

你需要在你的包体中创建一个包初始化块。这是一个相对神秘的 PL/SQL 包知识,但它存在并且可以使用。这是一个例子:

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

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

CREATE OR REPLACE PACKAGE BODY TEST_PKG IS
  -- package-private variables go first (if any)
(...) 
  -- then the public functions/procedures
(...)
  -- then a final BEGIN-END block which 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;

它应该打印当前日期。

分享和享受。

于 2012-06-01T14:35:07.447 回答
0

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

select MAX(date_) 
INTO tDate
from Table_Name;
于 2012-06-01T14:09:43.133 回答